2

同じテスト ケースを複数のクラスに適用するために、型パラメーター化されたテスト (サンプル #6 ) を実装しました。signed char[]unsigned char[]const signed char[]またはのいずれかに文字列を代入すると、次のconst unsigned char[]ようになります。

../stackoverflow.cpp: In member function ‘void IosTest_DummyTest_Test<gtest_TypeParam_>::TestBody() [with gtest_TypeParam_ = std::basic_istream<char, std::char_traits<char> >]’:                           
../stackoverflow.cpp:34:   instantiated from here
../stackoverflow.cpp:32: error: char-array initialized from wide string

さらに興味深いのは、テスト ケースを 1 つのタイプに適用するとすべて問題なく動作するのに、2 つ目のタイプを追加すると問題が発生することです。次のコードでエラーを再現できました。

#include "gtest/gtest.h"
#include <iostream>

// Factory methods
template<class T> std::ios* CreateStream();

template<>
std::ios* CreateStream<std::istream>() {
  return &std::cin;
}

template<>
std::ios* CreateStream<std::ostream>() {
  return &std::cout;
}

// Fixture class
template<class T>
class IosTest: public ::testing::Test {
 protected:
  IosTest() : ios_(CreateStream<T>()) {}
  virtual ~IosTest() {}
  std::ios* const ios_;
};

using testing::Types;
typedef Types<std::istream, std::ostream> Implementations;
TYPED_TEST_CASE(IosTest, Implementations);

TYPED_TEST(IosTest, DummyTest) {
  signed char c[] = ".";
  this->ios_->fill(c[0]);
};

typedef Types<std::istream, std::ostream> Implementations;で、 というタイプのリストが作成さImplementationsれ、次の行で、リストで定義されたタイプTYPED_TEST_CASE(IosTest, Implementations);にテスト ケースIosTestが適用されることが定義されImplementationsます。

すでに述べたように、リストからstd::istreamまたはを削除すると、警告なしでテストをコンパイルして実行できます (フラグを使用しています)。誰でもこの現象を説明できますか?std::ostreamImplementations-Wall

4

2 に答える 2

0

here で説明されている GCC のバグのようです。

すべてに変更signed char c[] = ".";すると、問題なく動作するようです。char c[] = ".";

于 2011-11-28T21:30:28.443 に答える
0

gtest ライブラリが、アプリ (stackoverflow.cpp) をコンパイルしている別のバージョンのコンパイラでビルドされている可能性はありますか? 新しいバージョンの gcc でビルドしたライブラリに関連するこのエラー メッセージを見て、それを古いバージョンの gcc にリンクしようとしたことを思い出します。

ソースから gtest をビルドしてみることができます。すべてを単一のヘッダー ファイルと単一の cpp ファイルに抽出して融合するスクリプトが付属しています。

この python スクリプトの gtest インストールを調べます。

gtest/scripts/fuse_gtest_files.py

スクリプトには、実行方法に関する指示があります。最終的に次の 2 つのファイルが作成されます。

  • gtest-all.cc
  • gtest.h

これを行う必要があるのは 1 回だけで、makefile に追加するだけです。Linux ベースのアプリを顧客に配布するために、まさにこれを行います。

于 2011-09-23T17:54:35.277 に答える