template member function of template class called from template function

c++, dependent-name, templates

Solution

Try the following code:

template<class T> void g()
{
   A<T> a;
   a.template f<3>();  // add `template` keyword here
}

According to C++'03 Standard 14.2/4:

When the name of a member template specialization appears after `.` or `->` in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword `template`. Otherwise the name is assumed to name a non-template.

Future C++ Standard seems to be still require this keyword according to draft n2857 14.3/4. Some compilers has special mode that allows to compile original code without errors (Comeau compiles it in so called relaxed mode).

Problem

This doesn't compile: ``` template<class X> struct A { template<int I> void f() {} }; template<class T> void g() { A<T> a; a.f<3>(); // Compilation fails here (Line 18) } int main(int argc, char *argv[]) { g<int>(); // Line 23 } ``` The compiler (gcc) says: hhh.cpp: In function 'void g()': hhh.cpp:18: error: expected primary-expression before ')' token hhh.cpp: In function 'void g() [with T = int]': hhh.cpp:23: instantiated from here hhh.cpp:18: error: invalid use of member (did you forget the '&' ?) Can anyone explain why this is? Is there a way to get it to work?

Original source

Related problems