Zer*_*ero 4 c++ most-vexing-parse
我不明白以下问题.
class InnerBox
{
public:
InnerBox() : mContents(123) { };
private:
int mContents;
};
class Box
{
public:
Box(const InnerBox& innerBox) : mInnerBox(innerBox) { };
private:
InnerBox mInnerBox;
};
void SomeFunction(const Box& box)
{
return;
}
int main()
{
Box box(InnerBox()); // !!PROBLEM!! Doesn't work: compiler thinks this is a function declaration
SomeFunction(box); // Error, cannot convert 'function pointer type' to const Box&
return 0;
}
Run Code Online (Sandbox Code Playgroud)
完整的错误消息是(Visual Studio 2010)
error C2664: 'SomeFunction' : cannot convert parameter 1 from 'Box (__cdecl *)(InnerBox (__cdecl *)(void))' to 'const Box &'
Run Code Online (Sandbox Code Playgroud)
修复很简单:
int main()
{
InnerBox innerBox;
Box box(innerBox);
SomeFunction(box);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个MSVC特定的问题,如果没有,有人可以解释这种语言的怪癖阻止我打电话Box box(InnerBox());吗?
你需要把它写成:
Box box((InnerBox()));
Run Code Online (Sandbox Code Playgroud)
要么
Box box{InnerBox()};
Run Code Online (Sandbox Code Playgroud)
这不是MSVC特定的问题.C++中的规则是考虑任何可能是声明声明的构造.
如果没有附加的括号,代码就会声明一个函数,该函数box返回一个Box,其单个参数是一个指向函数的指针,该函数不带参数并返回一个InnerBox.(是 - InnerBox()实际上在函数参数中使用时声明了一个指向函数(未命名)的指针(这类似于在用作函数参数时Box[]实际声明指针的方式Box)).
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |