我有以下代码:
enum nums {
a
};
class cls {
public:
cls( nums );
};
void function()
{
cls( a );
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用gcc编译它时,我收到以下错误:
test.cpp: In function ‘void function()’:
test.cpp:12:10: error: no matching function for call to ‘cls::cls()’
test.cpp:12:10: note: candidates are:
test.cpp:7:3: note: cls::cls(nums)
test.cpp:7:3: note: candidate expects 1 argument, 0 provided
test.cpp:5:7: note: cls::cls(const cls&)
test.cpp:5:7: note: candidate expects 1 argument, 0 provided
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)
如果我用这个替换函数:
void function()
{
cls name( a );
}
Run Code Online (Sandbox Code Playgroud)
一切正常.如果我使用带有两个参数的构造函数,它也可以工作.如果我在构造函数中添加"explicit",它就不起作用.
我得到gcc以某种方式将其解析为定义名为"a"的类型为"cls"的变量,但我不熟悉这种定义变量的语法.在我看来,这是一个定义cls类型的匿名临时变量的语句,传递"a"是参数.
用gcc 4.6.3编译.
任何见解?
谢谢,Shachar
Jam*_*nze 10
另一个最令人尴尬的解析问题的例子.这条线:
cls( a );
Run Code Online (Sandbox Code Playgroud)
声明一个名为atype 的局部变量cls,它通过调用默认构造函数来初始化(或者应该).哪个不存在,从而出现错误消息.
如果你真的想要构造一个将在之后立即销毁的临时对象,你可以通过将整个表达式放在括号中来消除歧义:
(cls( a ));
Run Code Online (Sandbox Code Playgroud)
括号中不能出现定义; 表达可以.