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_THROW1 つのパラメーターを持つコンストラクターを使用できない理由はありますか?

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)ではありません。これは、 という名前のデフォルトで構築されたオブジェクトの宣言です。あなたが書いたのと同じです- 括弧はオプションです。ClassOneClassThreeclassThree ClassOneclassThreeEXPECT_NO_THROW (ClassOne classThree);

https://youtu.be/lkgszkPnV8g?t=1750を参照

解決策 (C++11 を使用できる場合) は、均一な初期化を使用することです。

EXPECT_NO_THROW (ClassOne {classThree});

于 2019-02-04T14:45:56.263 に答える