代码之家  ›  专栏  ›  技术社区  ›  Ari

从模板函数调用模板类的模板成员函数

  •  42
  • Ari  · 技术社区  · 15 年前

    这不编译:

    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
    }
    

    编译器(GCC)说:

    hhh.cpp:在函数“void g()”中:

    hhh.cpp:18:错误:标记')之前需要主表达式

    hhh.cpp:在函数“void g()[with t=in t]”:

    hhh.cpp:23:从此处实例化

    hhh.cpp:18:错误:成员的使用无效(是否忘记了“&”?)

    有人能解释这是为什么吗?有办法让它工作吗?

    1 回复  |  直到 8 年前
        1
  •  76
  •   Kirill V. Lyadvinsky    15 年前

    尝试以下代码:

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

    根据C++03标准142/4:

    当成员模板专用化的名称出现在 . -> 在一个 后缀 -表达式,或之后 嵌套名称说明符 在一个 合格身份证 ,并且后缀表达式或限定ID显式依赖于模板参数(14.6.2),成员模板名称必须以关键字作为前缀。 template . 否则,将假定该名称命名非模板。

    未来的C++标准似乎仍然需要这个关键字根据草案N2557 143/4。有些编译器有特殊的模式,可以在不出错的情况下编译原始代码(comeau以所谓的 放松模式 )