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 Studio 特有的错误。根据标准:
\n\n\n\n\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
粗体文本是 VC++ 由于某种原因在 decltype 中无法正确执行的操作。由于希望 Microsoft 能够修复它是一个愚蠢的希望,您可以做的另一个解决方法是添加以下重载:
\n\ntemplate<class C, typename T>\nstatic T* test(T C::*);\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n可能在一个#ifdef/#endif检查 VC++ 的块中。不定义它可以防止它在未评估的上下文(例如 decltype)之外被静默选取,尽管只有链接时间错误。
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |