无法从FieldType *推导出T *的模板参数(仅Visual C ++)

jav*_*ver 6 templates decltype visual-c++ template-argument-deduction c++14

这段代码可以在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
}
Run Code Online (Sandbox Code Playgroud)

'T * AAA :: test(T *)':无法从'int TTT3 :: ' 推论出'T '的模板参数

  • 为什么?我的代码错了吗?-我不这么认为。
  • 如何使其在Visual C ++中进行编译?我需要它。

Sto*_*ica 1

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

\n\n

[expr.unary.op/4]

\n\n
\n

仅当使用显式 & 并且其\n 操作数是未括在括号中的限定 ID 时,才会形成指向成员的指针。[\xe2\x80\x89注意:\n即,表达式&(qualified-id),其中qualified-id括在括号中\n,不形成\xe2\x80\x9c类型的表达式,指向\n成员\xe2\x80\x9d。qualified-id 也没有,因为没有从非静态成员函数的qualified-id 到\n 类型\xe2\x80\x9c 指向成员函数\xe2\x80\x9d 的指针的隐式转换,如函数类型的左值到类型 \xe2\x80\x9c 的指针,函数\xe2\x80\x9d ([conv.func])。&unqualified-id 也不是指向成员的指针,即使在 unqualified-id 类的范围内也是如此。\xe2\x80\x94\xe2\x80\x89尾注\xe2\x80\x89]

\n
\n\n

粗体文本是 VC++ 由于某种原因在 decltype 中无法正确执行的操作。由于希望 Microsoft 能够修复它是一个愚蠢的希望,您可以做的另一个解决方法是添加以下重载:

\n\n
template<class C, typename T>\nstatic T* test(T C::*);\n
Run Code Online (Sandbox Code Playgroud)\n\n

Live Example

\n\n

可能在一个#ifdef/#endif检查 VC++ 的块中。不定义它可以防止它在未评估的上下文(例如 decltype)之外被静默选取,尽管只有链接时间错误。

\n