Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Template member functions in template class with separate definition

Reply
Thread Tools

Template member functions in template class with separate definition

 
 
=?iso-8859-1?q?Erik_Wikstr=F6m?=
Guest
Posts: n/a
 
      12-14-2006
The following code works:

#include <iostream>

template<class T>
struct Test
{
T t;
template<class T, template<class U = T> class V>
Test<T>& foo(V<T>& f)
{
f.t = 5;
return *this;
}
};

int main() {
Test<int> t;
t.foo(t);
std::cout << t.t;

}

However, if I try to move the definition of the foo()-function outside
of the declaration like so:

template<typename T, template<typename U = T> class V>
Test<T>& Test<T>::foo(V<T>& f)
{
f.t = 5;
return *this;
}

It does not compile (VC++8.0) with the following error-message:

test.cpp(24) : error C2244: 'Test<T>::foo' : unable to match function
definition to an existing declaration
definition
'Test<T> &Test<T>::foo(V<T> &)'
existing declarations
'Test<T> &Test<T>::foo(V<T> &)'

Anyone have an idea of how to make this work?

--
Erik Wikström

 
Reply With Quote
 
 
 
 
Steven T. Hatton
Guest
Posts: n/a
 
      12-14-2006
Erik Wikström wrote:

> The following code works:
>
> #include <iostream>
>
> template<class T>
> struct Test
> {
> T t;
> template<class T, template<class U = T> class V>
> Test<T>& foo(V<T>& f)
> {
> f.t = 5;
> return *this;
> }
> };
>
> int main() {
> Test<int> t;
> t.foo(t);
> std::cout << t.t;
>
> }
>
> However, if I try to move the definition of the foo()-function outside
> of the declaration like so:
>
> template<typename T, template<typename U = T> class V>
> Test<T>& Test<T>::foo(V<T>& f)
> {
> f.t = 5;
> return *this;
> }
>
> It does not compile (VC++8.0) with the following error-message:
>
> test.cpp(24) : error C2244: 'Test<T>::foo' : unable to match function
> definition to an existing declaration
> definition
> 'Test<T> &Test<T>::foo(V<T> &)'
> existing declarations
> 'Test<T> &Test<T>::foo(V<T> &)'
>
> Anyone have an idea of how to make this work?


The default argument in the function _definition_ looks wrong to me.

--
NOUN:1. Money or property bequeathed to another by will. 2. Something handed
down from an ancestor or a predecessor or from the past: a legacy of
religious freedom. ETYMOLOGY: MidE legacie, office of a deputy, from OF,
from ML legatia, from L legare, to depute, bequeath. www.bartleby.com/61/
 
Reply With Quote
 
 
 
 
=?iso-8859-1?q?Erik_Wikstr=F6m?=
Guest
Posts: n/a
 
      12-14-2006
On Dec 14, 1:03 pm, "Steven T. Hatton" <(E-Mail Removed)> wrote:
> Erik Wikström wrote:
> > The following code works:

>
> > #include <iostream>

>
> > template<class T>
> > struct Test
> > {
> > T t;
> > template<class T, template<class U = T> class V>
> > Test<T>& foo(V<T>& f)
> > {
> > f.t = 5;
> > return *this;
> > }
> > };

>
> > int main() {
> > Test<int> t;
> > t.foo(t);
> > std::cout << t.t;

>
> > }

>
> > However, if I try to move the definition of the foo()-function outside
> > of the declaration like so:

>
> > template<typename T, template<typename U = T> class V>
> > Test<T>& Test<T>::foo(V<T>& f)
> > {
> > f.t = 5;
> > return *this;
> > }

>
> > It does not compile (VC++8.0) with the following error-message:

>
> > test.cpp(24) : error C2244: 'Test<T>::foo' : unable to match function
> > definition to an existing declaration
> > definition
> > 'Test<T> &Test<T>::foo(V<T> &)'
> > existing declarations
> > 'Test<T> &Test<T>::foo(V<T> &)'

>
> > Anyone have an idea of how to make this work?

>
>The default argument in the function _definition_ looks wrong to me.


You mean the U = T part? I tried with "template<class T,
template<class> class V>" instead but with no luck.

--
Erik Wikström

 
Reply With Quote
 
Steven T. Hatton
Guest
Posts: n/a
 
      12-14-2006
Erik Wikström wrote:

> #include <iostream>
>
> template<class T>
> struct Test
> {
> T t;
> template<class T, template<class U = T> class V>
> Test<T>& foo(V<T>& f)
> {
> f.t = 5;
> return *this;
> }
> };
>
> int main() {
> Test<int> t;
> t.foo(t);
> std::cout << t.t;
>
> }
>
> However, if I try to move the definition of the foo()-function outside
> of the declaration like so:
>
> template<typename T, template<typename U = T> class V>
> Test<T>& Test<T>::foo(V<T>& f)
> {
> f.t = 5;
> return *this;
> }

The first form doesn't compile for me with GCC 4.0.2. Have I got it right?

//templ.cpp
#include <iostream>

template<class T>
struct Test
{
T t;
template<class T, template<class U = T> class V>
Test<T>& foo(V<T>& f)
{
f.t = 5;
return *this;
}
};

int main() {
Test<int> t;
t.foo(t);
std::cout << t.t;
}
//---------------EOF-----------------

g++ -o templ templ.cpp
templ.cpp:7: error: declaration of ?class T?
templ.cpp:3: error: shadows template parm ?class T?

Compilation exited abnormally with code 1 at Thu Dec 14 07:47:26

--
NOUN:1. Money or property bequeathed to another by will. 2. Something handed
down from an ancestor or a predecessor or from the past: a legacy of
religious freedom. ETYMOLOGY: MidE legacie, office of a deputy, from OF,
from ML legatia, from L legare, to depute, bequeath. www.bartleby.com/61/
 
Reply With Quote
 
Greg
Guest
Posts: n/a
 
      12-14-2006

Erik Wikström wrote:
> The following code works:
>
> #include <iostream>
>
> template<class T>
> struct Test
> {
> T t;
> template<class T, template<class U = T> class V>
> Test<T>& foo(V<T>& f)
> {
> f.t = 5;
> return *this;
> }
> };
>
> int main() {
> Test<int> t;
> t.foo(t);
> std::cout << t.t;
>
> }


The program is using "T" as the name of two separate type parameters,
So I would suggest giving each parameter a distinct name, maybe T1 and
T2, so that the compiler can tell them part.

Greg

 
Reply With Quote
 
=?iso-8859-1?q?Erik_Wikstr=F6m?=
Guest
Posts: n/a
 
      12-14-2006
On Dec 14, 1:52 pm, "Steven T. Hatton" <(E-Mail Removed)> wrote:
>
>The first form doesn't compile for me with GCC 4.0.2. Have I got it right?
>
> //templ.cpp
> #include <iostream>
>
> template<class T>
> struct Test
> {
> T t;
> template<class T, template<class U = T> class V>
> Test<T>& foo(V<T>& f)
> {
> f.t = 5;
> return *this;
> }
>
> };int main() {
> Test<int> t;
> t.foo(t);
> std::cout << t.t;}//---------------EOF-----------------
>
> g++ -o templ templ.cpp
> templ.cpp:7: error: declaration of ?class T?
> templ.cpp:3: error: shadows template parm ?class T?


Yes, that looks right, however I finally managed to find a working
solution:

#include <iostream>

template<class T>
struct Test
{
T t;
template<template<class U = T> class V>
Test<T>& foo(V<T>& f);
};

template<class T>
template<template<class> class V>
Test<T>& Test<T>::foo(V<T>& f)
{
f.t = 5;
return *this;
}

int main() {
Test<int> t;
t.foo(t);
std::cout << t.t;

}

Once again, the "template<template<class U = T> class V>" can be
reduced to "template<template<class> class V>" but I think that it
documents the intention that the type that V is parametrized by is the
same as that of Test.

--
Erik Wikström

 
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
Separate Template Definition I wrote class Data in header. The C++Compiler compiled without errors. I decided to move all member functionsinto source code because they are for implementation. I do not like thatthey are placed in class body. Immortal Nephi C++ 12 07-30-2010 11:54 AM
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
declaring class member functions as friend without full class definition Hicham Mouline C++ 0 11-11-2008 09:19 PM
Out-of-class definition of a non-template member of an explicitly specialized class template? BigMan C++ 3 04-22-2005 06:28 AM



Advertisments