googletest EXPECT_NO_THROW中没有适当的默认构造函数

时间:2012-06-06 10:50:14

标签: c++ googletest

声明:

class ClassOne
{
    ClassOne (ClassTwo* classTwo, ClassThree const& classThree);
}

测试:

ClassTwo* classTwo;
ClassThree classThree;
EXPECT_NO_THROW (ClassOne (classTwo, classThree));

这会编译并运行,但现在我将其更改为:

声明:

class ClassOne
{
    ClassOne (ClassThree const& classThree);
}

测试:

ClassThree classThree;
EXPECT_NO_THROW (ClassOne (classThree));

失败,“没有合适的默认构造函数”。

以下几行编译:

ClassOne classOne (classTwo, classThree);    // First case
ClassOne classOne (classThree);    // Second case

为什么我不能EXPECT_NO_THROW使用一个参数的构造函数?

2 个答案:

答案 0 :(得分:4)

我认为这是gtest中的一个错误(虽然我不是宏专家)。 EXPECT_NO_THROW最终扩展为:

#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
  if (::testing::internal::AlwaysTrue()) { statement; }

如果statement正文中包含if,您的代码将使用VS2012RC进行编译:

#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
  if (::testing::internal::AlwaysTrue()) { (statement); }
//                                         ^         ^

作为解决方法,您可以执行以下操作:

EXPECT_NO_THROW ((ClassOne (classThree)));

答案 1 :(得分:0)

您被C ++的most vexing parse所咬。 EXPECT_NO_THROW宏ClassOne (classThree)的“声明”自变量不是无名ClassOne对象的定义,该对象的构造函数获得名为{{1}的ClassThree对象}。它是名为classThree默认构造的 ClassOne对象的声明。就像您写过classThree一样-括号是可选的。

请参见https://youtu.be/lkgszkPnV8g?t=1750

解决方案(如果可以使用C ++ 11)是使用统一初始化:

EXPECT_NO_THROW (ClassOne classThree);

相关问题