将模板参数传递给内部结构时出错

时间:2017-10-25 17:38:18

标签: c++ templates

我尝试编译以下C ++代码:

recursive_function(*rai)

编译器抱怨说:

struct A {
    template< bool x >
    bool fun() {
        return x;
    }
};

template< typename T >
struct B {
    struct A2 {
        template< bool x >
        bool fun() {
            return x;
        }
    };

    void test() {
        A a;
        A2 a2;
        a.fun< true >();
        a2.fun< true >();
    }
};

但是上面的行(source_file.cpp: In member function ‘void B<T>::test()’: source_file.cpp:22:24: error: expected primary-expression before ‘)’ token a2.fun< true >(); ^ )编译得很好。有趣的是,如果我删除行a.fun< true >(),则编译成功。但是,由于最小(非)工作示例中未出现的原因,该行是必需的。这有什么不对?

1 个答案:

答案 0 :(得分:2)

在此背景下,A2实际上是B<T>::A2的简写。由于A2是依赖于模板参数T的类型,因此您必须使用明确的template关键字引用其成员模板

a2.template fun< true >();

A不是依赖类型,其成员模板可以用&#34; plain&#34;来引用。没有额外template关键字的语法。

参见14.2 / 4和类似的例子

  

14.2模板专精的名称[temp.names]

     

4 当成员模板专精的名称出现在后缀表达式中的.->之后或之后 qualified-id 中的嵌套名称说明符 postfix-expression 的对象表达式取决于类型或嵌套名称 qualified-id 中的-specifier 是指依赖类型,但名称不是当前实例化的成员(14.6.2.1),成员模板名称必须以前缀为前缀关键字template。   否则,假定该名称命名非模板。 [例如:

struct X { 
   template<std::size_t> X* alloc();
   template<std::size_t> static X* adjust();
 };
 template<class T> void f(T* p) {
   T* p1 = p->alloc<200>();          // ill-formed: < means less than
   T* p2 = p->template alloc<200>(); // OK: < starts template argument list
   T::adjust<100>();                 // ill-formed: < means less than
   T::template adjust<100>();        // OK: < starts template argument list
 }
     

-end example]