所以,我减少了一些代码:
#include <iostream>
#include <functional>
using namespace std;
struct Test {
template <class T>
void operator()() {
cout << typeid(T).name() << endl;
}
template <class T>
void f() {
cout << typeid(T).name() << endl;
}
};
template <typename S, typename T, typename T1>
mem_fun_ref_t<S, T> make_mem_fun_ref()
{
return mem_fun_ref(&T::template operator()<T1>); //A
//return mem_fun_ref(&T::template f<T1> ); //B
}
int main(int argc, char *argv[]) {
Test t;
make_mem_fun_ref<void, Test, int>()(t);
}
这在gcc下编译得很好,但VS2013抱怨:“错误C2902:'运算符':'模板'后面的意外标记,预期标识符”。
现在,如果我评论A行并使用B行,VS就不再抱怨了。
这是与operator()解释template关键字有关的错误吗? 我应该更改语法还是启用一些魔术标志/编译指示来编译A行?
BTW:我需要一个mem_fun_ref_t,它引用某个仿函数的模板化成员operator()。在任何人建议之前,我不能使用任何C ++ 11或Boost代码。
由于