4

宣言:

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使用一个参数的构造函数吗?

4

2 回答 2

4

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

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

statement如果包裹在正文中的括号中,则您的代码将使用 VS2012RC 进行编译if

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

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

EXPECT_NO_THROW ((ClassOne (classThree)));
于 2012-06-06T12:20:41.860 回答
0

你已经被 C++最令人头疼的 parse咬了。EXPECT_NO_THROW 宏的“语句”参数ClassOne (classThree)不是无名对象的定义ClassOne,其构造函数获取一个ClassThree名为 的对象classThree。它是一个名为的默认构造对象的声明。就像你写的一样- 括号是可选的。 ClassOneclassThreeEXPECT_NO_THROW (ClassOne classThree);

https://youtu.be/lkgszkPnV8g?t=1750

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

EXPECT_NO_THROW (ClassOne {classThree});

于 2019-02-04T14:45:56.263 回答