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

No appropriate default constructor available within googletest EXPECT_NO_THROW

本文关键字:默认 构造函数 EXPECT NO THROW googletest      更新时间:2023-10-16

声明:

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; }

如果statement括在if正文的括号中,则使用 VS2012RC 编译代码:

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

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

EXPECT_NO_THROW ((ClassOne (classThree)));

你已经被C++最烦人的解析咬了。EXPECT_NO_THROW宏ClassOne (classThree)的"语句"参数不是无名ClassOne对象的定义,其构造函数获得名为classThreeClassThree对象。它是默认构造ClassOne对象的声明,名为 classThree 。这与你写EXPECT_NO_THROW (ClassOne classThree);是一样的 - 括号是可选的。

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

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

EXPECT_NO_THROW (ClassOne {classThree});