473,499 Members | 1,903 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

operator = defined using template?

I defined operator = using template member function for a template class.
However compiler failed to recognize it is defined and created its own
version (which was member-wise copy, and a result was disastrous and hard to
debug bug, as pointer was copied).

Adding explicit operator = helped. See code snip below.

I am not sure if this compiler behaviour is standard conformant or not. Any
thoughts?

Regards
Ondrej

--
---------------------------------------
Ondrej Spanel
Lead Programmer
Bohemia Interactive Studio
www.bistudio.com
www.flashpoint1985.com

----------------------------------------------------------------------------
---

template<class Type, class Allocator=MemAllocD>
class AutoArray
{
Type *_data;
int _size;
....
public:
/// template "operator ="
template <class AnotherAllocator>
void operator = ( const AutoArray<Type,AnotherAllocator> &src )
{
... deep copy of _data array
}

/// explicit "operator =" - class does not compile well without it
void operator = ( const AutoArray &src )
{
... deep copy of _data array
}
};

void Foo()
{
AutoArray< SomeTemplate<SomeClass> > a;
AutoArray< SomeTemplate<SomeClass> > b;

b = a; /// bad code generated when explicit "operator =" not defined.
}
Nov 16 '05 #1
3 3389
Ondrej Spanel wrote:
I defined operator = using template member function for a template class.
However compiler failed to recognize it is defined and created its own
version (which was member-wise copy, and a result was disastrous and hard to
debug bug, as pointer was copied).

Adding explicit operator = helped. See code snip below.

I am not sure if this compiler behaviour is standard conformant or not. Any
thoughts?


According to the standard, a template assignment operator is never a copy
assignment operator and doesn't suppress generation of one by the compiler.
(Ditto for copy ctors.) So it sounds like the compiler was doing the right
thing, and you solved your problem in the right way.

--
Doug Harrison
Microsoft MVP - Visual C++
Nov 16 '05 #2
"Ondrej Spanel" <on***********@bistudionospam.com> wrote in message news:<eY**************@TK2MSFTNGP09.phx.gbl>...
I defined operator = using template member function for a template class.
However compiler failed to recognize it is defined and created its own
version (which was member-wise copy, and a result was disastrous and hard to
debug bug, as pointer was copied).


This is standard conforming behavior. The compiler will generate a
copy assignment operator if it does not find a user-defined
non-template copy assignment operator (cf. 12.8/9 footnote 109):

"Because a template assignment operator is never a copy assignment
operator, the presence of such a template does not suppress the
implicit declaration of a copy assignment operator. Template
assignment operators participate in overload resolution with other
assignment operators, including copy assignment operators, and a
template assignment operator may be used to assign an object if it
provides a better match than other assignment operators."

John
Nov 16 '05 #3
> >I am not sure if this compiler behaviour is standard conformant or not.
Any
thoughts?
According to the standard, a template assignment operator is never a copy
assignment operator and doesn't suppress generation of one by the

compiler. (Ditto for copy ctors.) So it sounds like the compiler was doing the right
thing, and you solved your problem in the right way.


Thank you for your explanation.

Regards
Ondrej
Nov 16 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

14
1694
by: ES Kim | last post by:
Consider: #include <string> #include <iostream> using namespace std; struct S { const char* ps_; operator string();
11
912
by: Jonan | last post by:
Hello, For several reasons I want to replace the built-in memory management with some custom built. The mem management itlsef is not subject to my question - it's ok to the point that I have...
5
3016
by: Vijai Kalyan | last post by:
Hello, I have come back to C++ after a couple of years with Java so I am quite rusty and this question may seem poor: My platform is Windows XP with MSVC 7.1. I have a class with a...
13
1724
by: Atlas | last post by:
Hi, I implemented a template as: template <int L, int M, int T> class Quantity { ..... public: friend Quantity operator*(const Quantity& q1,const Quantity& q2); ..... };
4
2486
by: Amadeus W. M. | last post by:
What is the difference between friend ostream & operator<<(ostream & OUT, const Foo & f){ // output f return OUT; } and template <class X>
2
2903
by: allan.mcrae | last post by:
I am having trouble with overloading the += operator when template parameters are used. I have a class holding an array (called "derived" in the following example) which derives from a base class...
7
1443
by: Jim Langston | last post by:
What I want to do is have an operator= accept a template variable. I will have some classes which all will contain an instance of a different class. I want an operator= in yet a 3rd class to...
9
2045
by: wo3kie | last post by:
#include <iostream> #include <map> #include <utility> // // Base // / | \ // Derived1 Derived2 \ // \ | / // Derived3
2
1762
by: Peng Yu | last post by:
Hi, In the following code, the 'copy' member function works. But the '=' operator does not work. Can somebody let me know why a member function is different from an operator. Thanks, Peng ...
0
7012
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7225
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
7392
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
5479
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
3105
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
3101
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1429
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
1
667
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
307
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.