为什么我不能调用派生自的模板类的模板化方法

时间:2012-03-14 15:36:33

标签: c++ templates

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中是专用的。这是对的吗?

1 个答案:

答案 0 :(得分:7)

M::message是一个从属名称,因为M是一个模板参数。编译器无法知道从属名称本身就是模板,因此您需要明确指定:

M::template message<int>();

否则编译器会解析代码,就像M::message是一个值一样,这使得下面的尖括号具有不同的含义(即它们被解析为小于和大于运算符而不是模板列表分隔符)。编译器无法从这种错误的解析中恢复。