这段代码可以在 g++(Coliru)上编译确定,但不能在 Visual C++(rextester)上编译-在线和桌面均可。
它是更大的Visual Studio 2015项目的简化版本。
class AAA{
public: template<class T> static T* test(T* hqi){
return hqi;
}
};
class TTT3{
public: int d; //In real case, it is some class, but same error nonetheless.
decltype(AAA::test(&d)) dfd=AAA::test(&d); //<-- error only Visual C++
};
int main(){
int b;
decltype(AAA::test(&b)) dfd=AAA::test(&b); //OK for boths
}
问题
最佳答案
这是特定于Visual Studio的错误。根据标准:
[expr.unary.op/4]
粗体字是VC++在decltype内由于任何原因无法正常工作的内容。由于希望微软能够解决此问题是愚蠢的希望,因此您可以执行的另一种解决方法是添加以下重载:
template<class C, typename T>
static T* test(T C::*);
Live Example
可能在用于检查VC++的
#ifdef/#endif
块中。没有定义它会阻止它在未评估的上下文(例如decltype)之外被无声地拾取,尽管只有链接时间错误。