struct Messages
{
template <typename V>
static const char* message() {return "test mesage";}
};
template <int Min, class M=Messages>
struct Test: public M
{
Test()
{
M::message<int>(); //error: expected primary-expression before 'int'
}
};
int main()
{
Test<5, Messages> t;
}
我怀疑这与一些相互依赖有关,比如 Test 的代码依赖于基类 M,其方法在 Test 中是专门的。这是正确的吗?
最佳答案
M::message
是一个从属名称,因为 M
是一个模板参数。编译器无法知道依赖名称本身就是模板,因此您需要明确指定:
M::template message<int>();
否则,编译器将代码解析为就好像 M::message
是一个值,这赋予后面的尖括号不同的含义(即它们被解析为小于和大于运算符,而不是作为模板列表分隔符)。编译器无法从这样的错误解析中恢复。
关于c++ - 为什么我不能调用派生自的模板类的模板化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705031/