googletest EXPECT_NO_THROW内没有可用的适当的默认构造函数

问题描述 投票:4回答:2

宣言:

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

c++ googletest
2个回答
4
投票

这是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)));

0
投票

你被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});

© www.soinside.com 2019 - 2024. All rights reserved.