这段代码可以在 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 C++中进行编译?我需要它。
  • 最佳答案

    这是特定于Visual Studio的错误。根据标准:

    [expr.unary.op/4]



    粗体字是VC++在decltype内由于任何原因无法正常工作的内容。由于希望微软能够解决此问题是愚蠢的希望,因此您可以执行的另一种解决方法是添加以下重载:

    template<class C, typename T>
    static T* test(T C::*);
    

    Live Example

    可能在用于检查VC++的#ifdef/#endif块中。没有定义它会阻止它在未评估的上下文(例如decltype)之外被无声地拾取,尽管只有链接时间错误。

    09-10 00:17
    查看更多