【发布时间】:2014-11-27 18:27:12
【问题描述】:
为什么下面的代码无效(至少使用 Visual Studio 2010 或ideone)?
// E.h
enum E
{
AN_E_VALUE
};
// C.h
class C
{
public:
explicit C(E e) // explicit keyword is optional
{}
void Foo() {}
};
// main.cpp
int main(int argc, char** argv)
{
C c(AN_E_VALUE); // fine
C(AN_E_VALUE); // error
C(AN_E_VALUE).Foo(); // fine
return 0;
}
如果参数不是单个枚举类型,则可以正常工作。
编译器将错误调用理解为一个带有 0 个参数的调用,其中预期为 1。这是为什么呢?
【问题讨论】:
-
编译器将其解释为变量声明。您的课程没有默认构造函数。错误。
-
是的,这是一个令人烦恼的解析。解决方案(如果你有 C++11)是做
C{AN_E_VALUE}。 -
太好了——确实,添加默认构造函数可以消除错误。但是,如果我将它添加为私有的——因为 C 类的默认构造对象没有意义,也不应该被允许——我们又回到了原点。编辑:盯着它看太久了……编译器生成的默认构造函数 is 是私有的。 #squareone
-
解决方案不是添加默认构造函数,而是选择不同的创建对象的方式。
C(AN_E_VALUE)被解释为变量声明,它不调用显式构造函数。您需要的是C{AN_E_VALUE}或您展示的其他变体之一。 -
标签: c++ constructor enums temporary-objects