VS2010中奇怪的重复模板模式错误?

时间:2013-12-07 16:10:46

标签: c++ visual-studio-2010 crtp

为什么这段代码不能在VS2010中编译?

struct Base
{
    void foo0() { }
};
template<typename BASE> struct Derived : BASE
{
    void foo1() { foo0(); }
};
int main()
{
    Derived<Base> ddd;
    ddd.foo1();
    return 0;   
}

它在其他编译器中编译得很好。如果我借助于此函数调用foo0,它也会编译:this-&gt; foo0();

2 个答案:

答案 0 :(得分:1)

我刚才发现这种行为背后的原因是Language Extensions编译器选项(/ Za)。因此,如果禁用语言扩展,则上述代码将无法编译。这里有什么奇怪的,这必须是C ++语言的一部分,而不是MS语言扩展。

希望这有助于某人...

答案 1 :(得分:1)

在声明Derived<BASE>::foo1()时,它不知道BASE是什么。然后它试图找出foo0是什么。视图中没有foo0 - 或者更糟糕的是,它会找到要调用的全局foo0。这是一个错误。

当您改为调用this->foo0()时,通知编译器您希望将其作为方法找到。