为什么在模板操作符上有编译错误C2951而在模板方法上没有?

时间:2014-10-30 07:13:46

标签: c++ visual-studio

我的示例代码位于

之下
#include <iostream>
using namespace std;
#define NUM 1

class A
{
public:
    template <int N>
    int operator()() { return N; }

    template <int N>
    int f() { return this->operator()<N>(); }
};

template <class TC>
int foo(TC& tc)
{
    int a = tc.template f < NUM > ();        // OK.
    a += tc.template operator() < NUM > ();  // Error C2951 on VisualStudio 2013
    return a;
}

int main(void)
{
    A a;
    cout << foo(a) << endl;
    return 0;
}

我知道如果用a += tc.template operator() < NUM >()替换a += tc.operator()<NUM>()可以避免编译错误,但是这个替换不能移植到Mac OS X的LLVM。

令我困惑的是A::operator()A::f都是成员函数,为什么编译好但一个失败?

0 个答案:

没有答案