On Thu, Mar 17, 2005 at 10:33:54AM +0200, Topi Maenpaa wrote:

> Hi,
> 
> Here is a snippet that does not compile with gcc 3.4.1 (on Mandrake 10.1).
> 
> ---------------------------------------------------
> template <class T> class A
> {
> public:
>   template <class U> void test(T value) {}
> };
> 
> template <class T> void test2(A<T>& a, T val)
> {
>   a.test<int>(val);

This needs to be:

   a.template test<int>(val);

> }
> 
> int main()
> {
>   A<int> a;
>   a.test<int>(1); //works fine
> }
> ---------------------------------------------------

> 
> $ g++ -o test test.cc
> test.cc: In function `void test2(A<T>&, T)':
> test.cc:9: error: expected primary-expression before "int"
> test.cc:9: error: expected `;' before "int"

Because test2 is a template it doesn't know what A<T> is (in the general
case) so you need to tell the compiler that a.test is a function template,
otherwise it is parsed as a member variable, giving "a.test less-than int",
which doesn't make sense.

> The funny thing is that if I change the name of the "test2" function to 
> "test", everything is OK. The compiler complains only if the functions have 
> different names. Why does the name matter?

That I'm not sure about ...
I would have expected it to fail with the same error when the function
is called "test" - but I'd be wrong apparently.

> The code compiles if "test2" is not a template function.

Because in that case the compiler knows the full definition of A and
knows that a.test refers to a function template, not a member variable
(for instance).

>                                                          Furthermore, calling 
> A<T>::test directly from main rather than through the template function works 
> fine.

Again, in that context the compiler knows that a.test is a function
template.

> I don't know if this is really a compiler thing, but it's hard to imagine the 
> standard would impose such behavior.

Yes, it's ugly. No, it's not a bug. It's required by the standard  :-(

jon

-- 
"I find television very educating. Every time somebody turns on the set, 
 I go into the other room and read a book."
        - Groucho Marx

Reply via email to