c++ - 调用模板化成员的模板化方法

标签 c++ templates

<分区>

我有这段代码,它没有编译(编辑:在 VC 中编译,但不是在 GCC 中编译):

template<int N>
struct List
{
   template <class C>
   void clear() { }
};

template <int L>
class Test
{
public:
    List<L> list; // <--This line
    void method()
    {
       list.clear<int>(); // <-- Compile error here:  error: expected primary-expression before ‘int’

    }
};

我怎样才能让它发挥作用?编译器 (gcc) 似乎不理解上下文,因为如果在标记行中我用数字替换 L,如 List<1> list; 然后编译正常。

最佳答案

当您使用 Test 模板参数实例化 List 时,它变成了一个依赖模板。编译器在解析 Test 时无法实例化它,因为它还不知道 L 的值,而且它只知道 List 可能是特化的L 的不同值不同。所以编译器不能确定 clear 是一个模板并且会混淆。您必须添加 template 关键字来消除歧义,例如:

list.template clear<int>();
//   ^^^^^^^^ here just before the dependent template

当您将 L 替换为 1 时,模板不再依赖于封闭模板的参数,因此编译器实例化并看到 clear是一个模板,不需要消歧。

依赖模板的所有成员都需要消除歧义。编译器总是假定它们是值(函数或数据),因此类型必须用 typename 和模板用 template 来消除歧义。

template 关键字的使用是规范的一部分。 MSVC 可以解析很多情况,包括这个,没有它,但它是 MSVC 扩展。 Gcc 在此处要求 template 关键字是正确的。

参见 this answer进行详尽的讨论。

关于c++ - 调用模板化成员的模板化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23601497/

相关文章:

c++ - 无法打开源文件 "GL/glew.h"

c++ - 将 CRTP 与 reinterpret_cast 转换为目标类

c++ - xcode 项目中有多个 .cpp 程序?

c++ - 泛型类的 Typedef(别名)

c++ - 实现用于生成具有给定范围的索引序列的 C++ 模板

c++ - 调整大小std::vector <std::unique_ptr <T >>的性能

c++ - 如何在每次执行中生成随机字符串(下一个必须与上一个不同)?

C++ 模板友元运算符与另一个类似的运算符

C++ 模板成员特化——这是编译器限制吗?

c++ - 关于模板代码组织 : where to put code that a template uses