构造其构造函数采用单个枚举参数的临时对象时出错

Posted

技术标签:

【中文标题】构造其构造函数采用单个枚举参数的临时对象时出错【英文标题】:Error constructing temporary object whose constructor takes a single enum parameter 【发布时间】: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)是做CAN_E_VALUE 太好了——确实,添加默认构造函数可以消除错误。但是,如果我将它添加为私有的——因为 C 类的默认构造对象没有意义,也不应该被允许——我们又回到了原点。编辑:盯着它看太久了……编译器生成的默认构造函数 is 是私有的。 #squareone 解决方案不是添加默认构造函数,而是选择不同的创建对象的方式。 C(AN_E_VALUE) 被解释为变量声明,它不调用显式构造函数。您需要的是 CAN_E_VALUE 或您展示的其他变体之一。 【参考方案1】:
C(AN_E_VALUE);

这声明了一个类型为C 的对象,其名称为AN_E_VALUE。该错误抱怨您需要一个默认构造函数来初始化AN_E_VALUE,但不存在默认构造函数(并且没有隐式声明)。你试过这个吗?:

int(a);

这基本上完成了同样的事情。也许看看this question。

【讨论】:

感谢您的回答。这种声明变量的语法必须是该语言中最可怕/最少使用的特性之一。 @zyndor ...离那个不远。

以上是关于构造其构造函数采用单个枚举参数的临时对象时出错的主要内容,如果未能解决你的问题,请参考以下文章

类的复制控制

构造拷贝构造赋值析构

基本语言

当具体对象采用不同的构造函数参数时,Java 中的工厂

c++,类的对象作为形参时一定会调用复制构造函数吗?

为啥通过构造函数返回对象时没有临时对象?