473,378 Members | 1,401 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,378 software developers and data experts.

Template friend (unary and binary) operators

Some questions about this code:

template <typename T> class MyTemplate;
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object);
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2);

template <typename T>
class MyTemplate
{
public:
MyTemplate (const T & data = T()) : mData(data) {}
MyTemplate (const MyTemplate <T> & object) : mData(object.mData) {}

MyTemplate <T> & operator= (const MyTemplate <T> & object) { mData =
object.mData; return *this; }

friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object);
MyTemplate <T> & operator-= (const MyTemplate <T> & object) { mData -=
object.mData; return *this; }
friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object1,
const MyTemplate <T> & object2);

private:

T mData;
};

template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object) { return MyTemplate <T> (-object.mData); }
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2) { MyTemplate <T> result(object1);
result -= object2; return result; }

int
main
{
MyTemplate <float> object1(1.0f);
MyTemplate <float> object2(-object1);
}

a) Trying to compile this wit MS Visual C++ 7.x returns me some syntax and
unexpected token errors, first, and then some "new definition" errors for
the friend operator-, saying me that it was previously defined as a member.
In fact, unary operator- is defined as a member, and subsequently binary
operator- is defined as a friend function. So, they are considered as the
same function by the compiler? This doesn't make sense for me, because they
have different parameters.

In order to deal with this, I've tried two alternatives: a) changing the
template MyTemplate <T> class for a non-template one, while keeping the
unary member and binary friend operator-, and b) keep MyTemplate <T> as a
template class, while changing member unary operator- for a friend one. In
both cases, these errors don't appear, and the code compiles (and works)
fine. So I know it is a fact which concern templates only. Is possible to
include a unary member operator- and a binary friend operator- in the same
template class?

b) Nothing to do with the previous question, first constructor have a
default parameter "const T & data = T()". When I instantiate MyTemplate
<float> objects through this constructor, both in the stack and in the heap,
mData is initialized to 0.0f value. Is this standard, being always all
built-in types initialized to zero when their default constructor (exists?)
is called (inside a template, for example)? Is this a coincidence, favoured
by the involved memory contents at the construction time? Or is this
compiler-dependent, implemented specifically by (in my case) MS Visual C++
7.x?
Jul 22 '05 #1
5 2605
Ruben Campos wrote:
Some questions about this code:

template <typename T> class MyTemplate;
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object);
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2);

template <typename T>
class MyTemplate
{
public:
MyTemplate (const T & data = T()) : mData(data) {}
MyTemplate (const MyTemplate <T> & object) : mData(object.mData) {}

MyTemplate <T> & operator= (const MyTemplate <T> & object) { mData =
object.mData; return *this; }

friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object);
MyTemplate <T> & operator-= (const MyTemplate <T> & object) { mData -=
object.mData; return *this; }
friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object1,
const MyTemplate <T> & object2);

private:

T mData;
};

template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object) { return MyTemplate <T> (-object.mData); }
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2) { MyTemplate <T> result(object1);
result -= object2; return result; }

int
main
{
MyTemplate <float> object1(1.0f);
MyTemplate <float> object2(-object1);
}

a) Trying to compile this wit MS Visual C++ 7.x returns me some syntax and
unexpected token errors, first, and then some "new definition" errors for
the friend operator-, saying me that it was previously defined as a member.
It compiles just fine with gcc 3.3.3 (after adding parantheses after
main), so I suppose that there's nothing wring with the code as such.
b) Nothing to do with the previous question, first constructor have a
default parameter "const T & data = T()". When I instantiate MyTemplate
<float> objects through this constructor, both in the stack and in the heap,
mData is initialized to 0.0f value. Is this standard, being always all
built-in types initialized to zero when their default constructor (exists?)
is called (inside a template, for example)? Is this a coincidence, favoured
by the involved memory contents at the construction time? Or is this
compiler-dependent, implemented specifically by (in my case) MS Visual C++
7.x?


I don't believe the standard says anything about implicitly initializing
variables, so (without reading the standard) I'd say it's
compiler-dependent.

/ martin
Jul 22 '05 #2

"Martin Magnusson" <martin@-xx-blecket-xx-.org> escribió en el mensaje
news:1101811069.OMD19JDIzON1F445jEDYbw@teranews...
Ruben Campos wrote:
Some questions about this code:

template <typename T> class MyTemplate;
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object);
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2);

template <typename T>
class MyTemplate
{
public:
MyTemplate (const T & data = T()) : mData(data) {}
MyTemplate (const MyTemplate <T> & object) : mData(object.mData) {}

MyTemplate <T> & operator= (const MyTemplate <T> & object) { mData =
object.mData; return *this; }

friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object);
MyTemplate <T> & operator-= (const MyTemplate <T> & object) {
mData -= object.mData; return *this; }
friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object1,
const MyTemplate <T> & object2);

private:

T mData;
};

template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object) { return MyTemplate <T> (-object.mData); }
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2) { MyTemplate <T>
result(object1); result -= object2; return result; }

int
main
{
MyTemplate <float> object1(1.0f);
MyTemplate <float> object2(-object1);
}

a) Trying to compile this wit MS Visual C++ 7.x returns me some syntax
and unexpected token errors, first, and then some "new definition" errors
for the friend operator-, saying me that it was previously defined as a
member.
It compiles just fine with gcc 3.3.3 (after adding parantheses after
main), so I suppose that there's nothing wring with the code as such.


Sorry, it's only a transcription error. It should appear as:

int
main (int argn, char ** argc)

The errors I've described are related with the template, and its friend
functions. They appear with MS Visual C++ 7.1.3088, even when enabling the
Microsoft language extensions (which I don't want to keep enabled).
b) Nothing to do with the previous question, first constructor have a
default parameter "const T & data = T()". When I instantiate MyTemplate
<float> objects through this constructor, both in the stack and in the
heap, mData is initialized to 0.0f value. Is this standard, being always
all built-in types initialized to zero when their default constructor
(exists?) is called (inside a template, for example)? Is this a
coincidence, favoured by the involved memory contents at the construction
time? Or is this compiler-dependent, implemented specifically by (in my
case) MS Visual C++ 7.x?


I don't believe the standard says anything about implicitly initializing
variables, so (without reading the standard) I'd say it's
compiler-dependent.

/ martin

Jul 22 '05 #3
Sorry. I included the code corresponding to the first compilable variation
code, that with unary operator- as a friend function. So tell me repeat my
first message, now corrected. Sorry, Martin Magnusson, for this (all mine)
mistake.

Some questions about this code:

template <typename T> class MyTemplate;
template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2);

template <typename T>
class MyTemplate
{
public:
MyTemplate (const T & data = T()) : mData(data) {}
MyTemplate (const MyTemplate <T> & object) : mData(object.mData) {}

MyTemplate <T> & operator= (const MyTemplate <T> & object) { mData =
object.mData; return *this; }

MyTemplate <T> operator- (const MyTemplate <T> & object) { return
MyTemplate <T> (-mData); }
MyTemplate <T> & operator-= (const MyTemplate <T> & object) { mData -=
object.mData; return *this; }
friend MyTemplate <T> operator- <T> (const MyTemplate <T> & object1,
const MyTemplate <T> & object2);

private:
T mData;
};

template <typename T> MyTemplate <T> operator- (const MyTemplate <T> &
object1, const MyTemplate <T> & object2) { MyTemplate <T> result(object1);
result -= object2; return result; }

int
main (int argn, char ** argc)
{
MyTemplate <float> object1(1.0f);
MyTemplate <float> object2(-object1);
}

a) Trying to compile this wit MS Visual C++ 7.x returns me some syntax and
unexpected token errors, first, and then some "new definition" errors for
the binary friend operator-, saying me that it was previously defined as a
member. In fact, unary operator- is defined as a member, and subsequently
binary operator- is defined as a friend function. So, are they considered
the same function by the compiler? This doesn't make sense for me, because
they have different parameters.

In order to deal with this, I've tried two alternatives: a) changing the
template MyTemplate <T> class for a non-template one, while keeping the
unary member and binary friend operator-, and b) keep MyTemplate <T> as a
template class, while changing member unary operator- for a friend one. In
both cases, these errors don't appear, and the code compiles (and works)
fine. So I know it is a fact which concern templates only. Is possible to
include a unary member operator- and a binary friend operator- in the same
template class?

NOTE: in a real case, I use to include all the implementations in a separate
..cpp file (which, in the case of template classes, is #included in the .h).
For readability, and for short, I included here implementation of member
functions directly inside template class declaration, but I kept the
implementation of the friend function outside, in order to reproduce the
error situation. I've tried this code, however, and it really returns me
errors which I've mentioned.

b) Nothing to do with the previous question, first constructor have a
default parameter "const T & data = T()". When I instantiate MyTemplate
<float> objects through this constructor, both in the stack and in the heap,
mData is initialized to 0.0f value. Is this standard, being always all
built-in types initialized to zero when their default constructor (exists?)
is called (inside a template, for example)? Is this a coincidence, favoured
by the involved memory contents at the construction time? Or is this
compiler-dependent, implemented specifically by (in my case) MS Visual C++
7.x?
Jul 22 '05 #4
"Ruben Campos" <Ru**********@robotica.uv.es> wrote in message news:<co**********@peque.uv.es>...
Some questions about this code:
[snip]
int
main main () {
MyTemplate <float> object1(1.0f);
MyTemplate <float> object2(-object1);
}


With the fix for main compiles just fine with VC++ 7.1

/dan
Jul 22 '05 #5
Please, see my last (and corrected) message in this thread. Sorry for the
mistake, and thank you for your time.

"Dan Cernat" <dc*****@excite.com> escribió en el mensaje
news:aa**************************@posting.google.c om...
"Ruben Campos" <Ru**********@robotica.uv.es> wrote in message
news:<co**********@peque.uv.es>...
Some questions about this code:


[snip]
int
main

main ()
{
MyTemplate <float> object1(1.0f);
MyTemplate <float> object2(-object1);
}


With the fix for main compiles just fine with VC++ 7.1

/dan

Jul 22 '05 #6

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

Similar topics

8
by: Elementary Penguin | last post by:
Is there a left add unary operator ( or do I have to overload one ) ? For example: string s1 = "A"; s1 += "B"; Console.WriteLine( s1 )
5
by: Teddy | last post by:
Hello all consider the class Date declaretion below: class Date { public: Date(); Date(int year, int month, int day); Date(const string&); int getYear() const;
4
by: desalvo123 | last post by:
This compile and works fine. Example 1: --------------------- class MyDouble { public: MyDouble(double val) { m_Value = val; }; friend MyDouble operator + (const MyDouble&, const MyDouble&);
13
by: jsnX | last post by:
say i have a function object silly that takes a const ref to clowns class silly : public std::unary_function<const clown&, bool> { ... } and then i decide to feed it a bunch of pointers to...
17
by: Anoob | last post by:
Can we consider () unary operator when calling a function, in exps eq. f(), ( 1 + 2). But when we call function f( 10 ) it is a binary operator. Even if we pass f( 10, 20) as we are using ,...
3
by: Hamilton Woods | last post by:
Diehards, I developed a template matrix class back around 1992 using Borland C++ 4.5 (ancestor of C++ Builder) and haven't touched it until a few days ago. I pulled it from the freezer and...
1
by: Helmut Jarausch | last post by:
Hi, could anybody please explain to me what's wrong with the following code template <typename INT,INT Pclass Zp; template <typename INT,INT P> Zp<INT,Poperator-(const Zp<INT,P>& a, const...
9
by: neildferguson | last post by:
I am using templates with a little project I am working on. My compiler (GCC) is finding a particular construct ambiguous. Can anyone suggest something I might change in the declaration of class...
16
by: JoseMariaSola | last post by:
How may operators and operands does (typename) expression has? I'd say one operator, the cast operator, and two operands: typename and expression. But everywhere I read, cast is categorized as...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

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.