繁体   English   中英

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

[英]Error when passing template parameters to inner structure

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

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 >() )可以正常编译。 有趣的是,如果删除行template< typename T > ,则编译成功。 但是,由于在最小(非)工作示例中未出现该原因,因此需要该行。 怎么了

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

a2.template fun< true >();

A不是从属类型,并且其成员模板可以使用“普通”语法来引用,而无需该额外的template关键字。

参见14.2 / 4和那里的类似示例

14.2模板专长的名称[临时名称]

4当成员模板专业名称出现在之后. ->postfix-expression中,或者在qualified-id中嵌套名称说明符之后,并且postfix-expression的对象表达式取决于类型,或者qualified-id中nested-name-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 } 

—末例]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM