Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Overloading template operators C++6 to VS2005

Reply
Thread Tools

Overloading template operators C++6 to VS2005

 
 
AlanJSmith
Guest
Posts: n/a
 
      10-03-2006
I am converting some C++ projects from 6 to vs2005 in one of the headers i
have the code that follows this passage in which I get an error saying int
default cant be assumed so i added DBString<nSize> DBString<nSize>:: to the
copy assignment same size oporator and this seems to work, if i try the same
thing with copy assignment different sizes i get error C3856:
'DBString<nSize>::=': class is not a class template and adding any type
between template<int nInSize> and operator = without the DBString<nSize>::
gives me a c++ optimizer had to close send error report to microsoft error.
I have been searching for an answer for a couple of hours now can any one
help please.

template<int nSize> class DBString
{
public:
............
// copy assignment (different size)
template<int nInSize> operator =(const DBString<nInSize>& strNewValue)
{
strncpy((char*)strValue,(char*)strNewValue.strValu e,nInSize);
nIndicator = strNewValue.nIndicator;
}

// copy assignment (same size)
DBString<nSize> DBString<nSize>:perator =(const DBString<nSize>&
strNewValue)
{
strncpy((char*)strValue,(char*)strNewValue.strValu e,nSize);
nIndicator = strNewValue.nIndicator;
}


 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      10-04-2006
AlanJSmith wrote:
> I am converting some C++ projects from 6 to vs2005 in one of the
> headers i have the code that follows this passage in which I get an
> error saying int default cant be assumed so i added DBString<nSize>
> DBString<nSize>:: to the copy assignment same size oporator and this
> seems to work, if i try the same thing with copy assignment different
> sizes i get error C3856: 'DBString<nSize>::=': class is not a class
> template and adding any type between template<int nInSize> and
> operator = without the DBString<nSize>:: gives me a c++ optimizer had
> to close send error report to microsoft error. I have been searching
> for an answer for a couple of hours now can any one help please.


This seems to fall under FAQ 5.8. Please take time to read it before
your next post.

>
> template<int nSize> class DBString
> {
> public:
> ...........
> // copy assignment (different size)
> template<int nInSize> operator =(const DBString<nInSize>& strNewValue)
> {
> strncpy((char*)strValue,(char*)strNewValue.strValu e,nInSize);


There seems to be no check if 'nInSize' is greater than nSize, which
might present a problem, IME...

> nIndicator = strNewValue.nIndicator;
> }
>
> // copy assignment (same size)
> DBString<nSize> DBString<nSize>:perator =(const DBString<nSize>&
> strNewValue)
> {
> strncpy((char*)strValue,(char*)strNewValue.strValu e,nSize);
> nIndicator = strNewValue.nIndicator;
> }


V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
 
 
 
AlanJSmith
Guest
Posts: n/a
 
      10-05-2006

"Victor Bazarov" <(E-Mail Removed)> wrote in message
news(E-Mail Removed). ..
> AlanJSmith wrote:
>> I am converting some C++ projects from 6 to vs2005 in one of the
>> headers i have the code that follows this passage in which I get an
>> error saying int default cant be assumed so i added DBString<nSize>
>> DBString<nSize>:: to the copy assignment same size oporator and this
>> seems to work, if i try the same thing with copy assignment different
>> sizes i get error C3856: 'DBString<nSize>::=': class is not a class
>> template and adding any type between template<int nInSize> and
>> operator = without the DBString<nSize>:: gives me a c++ optimizer had
>> to close send error report to microsoft error. I have been searching
>> for an answer for a couple of hours now can any one help please.

>
> This seems to fall under FAQ 5.8. Please take time to read it before
> your next post.
>
>>
>> template<int nSize> class DBString
>> {
>> public:
>> ...........
>> // copy assignment (different size)
>> template<int nInSize> operator =(const DBString<nInSize>& strNewValue)
>> {
>> strncpy((char*)strValue,(char*)strNewValue.strValu e,nInSize);

>
> There seems to be no check if 'nInSize' is greater than nSize, which
> might present a problem, IME...
>
>> nIndicator = strNewValue.nIndicator;
>> }
>>
>> // copy assignment (same size)
>> DBString<nSize> DBString<nSize>:perator =(const DBString<nSize>&
>> strNewValue)
>> {
>> strncpy((char*)strValue,(char*)strNewValue.strValu e,nSize);
>> nIndicator = strNewValue.nIndicator;
>> }

>
> V
> --
> Please remove capital 'A's when replying by e-mail
> I do not respond to top-posted replies, please don't ask
>
>


Ok you were right i didnt read the faq's so here it is as a complete
compilable unit, I turned off precompiled headers and common lanuage runtime
support.

template<int nSize> class DBString
{
public:

// Indicates status of string, eg. length, NULL
long nIndicator;

// array of characters of appropriate length holds actual data
unsigned char strValue[((nSize/4)%4==0)? nSize : (nSize/4)*4];

template<int nInSize> operator =(const DBString<nInSize>& strNewValue)
{
_strncpy_s((char*)strValue,nSize,(char*)strNewValu e.strValue,nInSize);
}

// copy assignment (same size)
DBString<nSize> DBString<nSize>:perator =(const DBString<nSize>&
strNewValue)
{
_strncpy_s((char*)strValue,nSize,(char*)strNewValu e.strValue,nSize);
nIndicator = strNewValue.nIndicator;
}

};


I have corrected the prob with nSize and nInSize as suggested but i knew i
would have to do that. the prob isnt with the content of the overloaded
operators but the syntax of the decaration which causes me this error when
trying to compile.

\DBString.cpp(12) : error C4430: missing type specifier - int assumed. Note:
C++ does not support default-int
1> .\DBString.cpp(24) : see reference to class template instantiation
'DBString<nSize>' being compiled

obviously i have tried lots of variations on the syntax but i am still
flummoxed, there is the chance that what i am trying to do is not allowed in
VS2005 but i am not sure.



 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-05-2006
AlanJSmith wrote:
> [..]
> template<int nSize> class DBString
> {
> public:
>
> // Indicates status of string, eg. length, NULL
> long nIndicator;
>
> // array of characters of appropriate length holds actual data
> unsigned char strValue[((nSize/4)%4==0)? nSize : (nSize/4)*4];
>
> template<int nInSize> operator =(const DBString<nInSize>&


You wrote

template<int nInSize>
/***what return value type???***/
operator =(

That's what your compiler is asking about.

> strNewValue) {
>
> _strncpy_s((char*)strValue,nSize,(char*)strNewValu e.strValue,nInSize);
> }
> // copy assignment (same size)
> DBString<nSize> DBString<nSize>:perator =(const DBString<nSize>&
> strNewValue)
> {
> _strncpy_s((char*)strValue,nSize,(char*)strNewValu e.strValue,nSize);
> nIndicator = strNewValue.nIndicator; }
> };
>
>
> I have corrected the prob with nSize and nInSize as suggested but i
> knew i would have to do that. the prob isnt with the content of the
> overloaded operators but the syntax of the decaration which causes me
> this error when trying to compile.
>
> \DBString.cpp(12) : error C4430: missing type specifier - int
> assumed. Note: C++ does not support default-int
> 1> .\DBString.cpp(24) : see reference to class template instantiation
> 'DBString<nSize>' being compiled
>
> obviously i have tried lots of variations on the syntax but i am still
> flummoxed, there is the chance that what i am trying to do is not
> allowed in VS2005 but i am not sure.


Flummoxed? Really?

There are three essential syntaxes for a function declaration.

First is a constructor/destructor, which are special since they don't have
the return type *at all*.

Second is a conversion function in the form of

operator {sometype} ();

and the return value type is the {sometype} in its declaration.

The third, *and the most common* syntax is

{sometype} {functionname} ( [{arguments}] );

Those include overloaded operators whose name is somewhat special, which
has the form 'operator@' where the '@' is the actual operator symbol (can
have more than one character).

To make it any of those a template you just put "template< args >" in
front of them, right?

So, where did the return type go in your operator= declaration?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
Roland Pibinger
Guest
Posts: n/a
 
      10-05-2006
On Thu, 5 Oct 2006 01:00:31 +0100, "AlanJSmith"
<(E-Mail Removed)> wrote:
>so here it is as a complete
>compilable unit, I turned off precompiled headers and common lanuage runtime
>support.
>
>template<int nSize> class DBString
>{
>public:
>
> // Indicates status of string, eg. length, NULL
> long nIndicator;
>
> // array of characters of appropriate length holds actual data
> unsigned char strValue[((nSize/4)%4==0)? nSize : (nSize/4)*4];
>
> template<int nInSize> operator =(const DBString<nInSize>& strNewValue)
> {
> _strncpy_s((char*)strValue,nSize,(char*)strNewValu e.strValue,nInSize);
> }
>
> // copy assignment (same size)
> DBString<nSize> DBString<nSize>:perator =(const DBString<nSize>&
>strNewValue)
> {
> _strncpy_s((char*)strValue,nSize,(char*)strNewValu e.strValue,nSize);
> nIndicator = strNewValue.nIndicator;
> }
>
>};


What you (maybe) try to do is to define two operator= for your class
template DBString: one 'standard' operator= and one that accepts
DBStrings of different nSize, something like:

template<int nSize>
class DBString
{
public:
// copy assignment (same size)
DBString& operator =(const DBString& strNewValue) {
// your code
return *this;
}

// copy assignment (different size)
template<class U> DBString& operator= (const DBString<U>& r) {
// your code
return *this;
}
};

This doesn't work, because the template parameter is an integral type.


Best wishes,
Roland Pibinger
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-05-2006
Roland Pibinger wrote:
> [..]
>
> // copy assignment (different size)
> template<class U> DBString& operator= (const DBString<U>& r) {


You mean

template<int U> DBString& operator= (const DBString<U>& r) {

> // your code
> return *this;
> }
> };
>
> This doesn't work, because the template parameter is an integral type.


Huh?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
Roland Pibinger
Guest
Posts: n/a
 
      10-05-2006
On Thu, 5 Oct 2006 14:02:50 -0400, "Victor Bazarov"
<(E-Mail Removed)> wrote:
>Roland Pibinger wrote:
>> [..]
>>
>> // copy assignment (different size)
>> template<class U> DBString& operator= (const DBString<U>& r) {

>
> You mean
>
> template<int U> DBString& operator= (const DBString<U>& r) {


Yes, that's it. It also works for integral types.

Best regards,
Roland Pibinger
 
Reply With Quote
 
AlanJSmith
Guest
Posts: n/a
 
      10-05-2006

"Roland Pibinger" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> On Thu, 5 Oct 2006 14:02:50 -0400, "Victor Bazarov"
> <(E-Mail Removed)> wrote:
>>Roland Pibinger wrote:
>>> [..]
>>>
>>> // copy assignment (different size)
>>> template<class U> DBString& operator= (const DBString<U>& r) {

>>
>> You mean
>>
>> template<int U> DBString& operator= (const DBString<U>& r) {

>
> Yes, that's it. It also works for integral types.
>
> Best regards,
> Roland Pibinger


Thank You Roland and Victor,

yes i have it working now with the problem was i kept using DBString<nSize>&
as the return type and this caused the compiler to break.
this was all written 11 years ago by someone else so i am not sure why they
didnt have a return type.

template<int nInSize>
DBString& operator =(const DBString<nInSize>& strNewValue)
{
strncpy_s((char*)strValue,nSize,(char*)strNewValue .strValue,nInSize);
return *this;
}

// copy assignment (same size)
DBString<nSize>& operator =(const DBString<nSize>& strNewValue)
{
strncpy_s((char*)strValue,nSize,(char*)strNewValue .strValue,nSize);
nIndicator = strNewValue.nIndicator;
return *this;
}


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
overloading non-template member functions with template member functions Hicham Mouline C++ 1 04-24-2009 07:47 AM
overloading non-template member functions with template member functions Hicham Mouline C++ 0 04-23-2009 11:42 AM
overloading on the template parameter arity of a template templateparameter Howard Gardner C++ 4 07-19-2006 11:10 PM
Template class operators overloading difficulty Theodore V. Tolstoy C++ 2 10-04-2004 10:53 AM
Re: Overloading New/Delete Operators Ron Natalie C++ 0 07-09-2003 05:16 PM



Advertisments