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中是专用的。这是对的吗?
答案 0 :(得分:7)
M::message
是一个从属名称,因为M
是一个模板参数。编译器无法知道从属名称本身就是模板,因此您需要明确指定:
M::template message<int>();
否则编译器会解析代码,就像M::message
是一个值一样,这使得下面的尖括号具有不同的含义(即它们被解析为小于和大于运算符而不是模板列表分隔符)。编译器无法从这种错误的解析中恢复。