Re: Why does my template need a type?
Am 12.03.2013 22:33, schrieb DeMarcus:
Hi,
Usually I want to separate the declaration from the definition also
for templates, but I bumped into an interesting error when doing that
recently. Consider this separation.
template<typename T>
class A
{
public:
A& getMe( A& arg ); // Separated implementation below.
};
template<typename T>
A& A<T>::getMe( A& arg )
{
return *this;
}
int main()
{
A<int> a;
A<int> b;
a.getMe( b );
return 0;
}
This code gives me on gcc 4.7.2.
error: invalid use of template-name ?A? without an argument list
But if I change the return type to look like the following, it
compiles.
template<typename T>
A<T>& A<T>::getMe( A& arg )
{
return *this;
}
My question is; why do I get a compilation error for the return type
but not for the argument 'arg' that is still just an A& ?
I think the reason is that in your out-of-class definition, the injected
class name has not been inserted at that point (Take this with a grain
of salt). IMO 9 p2 says:
"A class-name is inserted into the scope in which it is declared
immediately after the class-name is seen. The class-name is also
inserted into the scope of the class itself; this is known as the
injected-class-name."
This happens not before the "A<T>::" in your example code. A different
way of fixing your problem would be to take advantage of the
"trailing-return-type" syntax, such as:
template<typename T>
auto A<T>::getMe( A& arg )-> A&
{
return *this;
}
Now, the return type "A&" is *after* the start of the scope and thus
should be accepted as well.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]