【问题标题】: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)是做C{AN_E_VALUE}
  • 太好了——确实,添加默认构造函数可以消除错误。但是,如果我将它添加为私有的——因为 C 类的默认构造对象没有意义,也不应该被允许——我们又回到了原点。编辑:盯着它看太久了……编译器生成的默认构造函数 is 是私有的。 #squareone
  • 解决方案不是添加默认构造函数,而是选择不同的创建对象的方式。 C(AN_E_VALUE) 被解释为变量声明,它不调用显式构造函数。您需要的是 C{AN_E_VALUE} 或您展示的其他变体之一。

标签: c++ constructor enums temporary-objects


【解决方案1】:
C(AN_E_VALUE);

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

int(a);

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

【讨论】:

  • 感谢您的回答。这种声明变量的语法必须是该语言中最可怕/最少使用的特性之一。
  • @zyndor ...离那个不远。
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2014-07-30
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多