宣言:
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
?
这是GTEST一个错误,我认为(虽然我对宏不是专家)。 EXPECT_NO_THROW
最终扩展为:
#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
if (::testing::internal::AlwaysTrue()) { statement; }
你的代码编译使用VS2012RC如果statement
被包裹在if
体括号:
#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
if (::testing::internal::AlwaysTrue()) { (statement); }
// ^ ^
作为一种变通方法,你可以这样做:
EXPECT_NO_THROW ((ClassOne (classThree)));
你被C ++的most vexing parse咬伤。该“声明”的说法到EXPECT_NO_THROW宏,ClassOne (classThree)
,是不是无名ClassOne
对象,其构造函数将被命名ClassThree
classThree
对象的定义。这是一个默认构造ClassOne
对象,名为classThree
的声明。这是一样的,如果你写EXPECT_NO_THROW (ClassOne classThree);
- 括号中是可选的。
见https://youtu.be/lkgszkPnV8g?t=1750
将该溶液(如果可以使用C ++ 11)是用均匀的初始化:
EXPECT_NO_THROW (ClassOne {classThree});