声明:
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
使用一个参数的构造函数?
答案 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);