2011-08-12 15 views
2

同じテストケースを複数のクラスに適用するために、型パラメータ化テスト(Sample #6)を実装しました。より興味深いのは何ですかGoogleテスト:「ワイド文字列から初期化された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種類にテストケースを適用するとき、すべてがうまく行くということですが、ときに私:signed char[]unsigned char[]const signed char[]またはconst unsigned char[]のいずれかに文字列を割り当てるときに、私が得ることが起こりますそれが爆発する第2のタイプを追加してください。私は、次のコードでエラーを再現することができます:ラインtypedef Types<std::istream, std::ostream> Implementations;

#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]); 
}; 

Implementationsと呼ばれるタイプのリストを作成し、次の行、TYPED_TEST_CASE(IosTest, Implementations);で、テストケースIosTestが型付きに適用されることが規定されていますImplementationsリストに定義されています。

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

+0

どのコンパイラを使用していますか? – Poodlehat

+0

私は職場で古代のブラウザを使わなければならないので、googleテストサイトでコードを見ることはできませんが、1つしか含まれていないと何らかの理由で文字列が使用されるようですが、それはwchar_t文字列を使用しています。私はテンプレートが手がかりのためにどのように拡大されているのかを見ていきたいと思います。 – Poodlehat

+0

32行目は 'signed char c [] ="。 ";'ですか?それは私が見る唯一のchar []です。 – MSalters

答えて

0

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

ソースからgtestを構築できます。それは、すべてを1つのヘッダファイルと1つのcppファイルに抽出して融合するスクリプトを備えています。このPythonスクリプトのためのあなたのGTESTのインストールで

ルック:

gtest/scripts/fuse_gtest_files.py 

それを実行する方法については、スクリプト内の命令があります。あなたは一度だけこの操作を行うと、あなたのメイクファイルに追加する必要があり

  • gtest-all.cc
  • gtest.h

:次の2つのファイルで終わります。私はLinuxベースのアプリを顧客に配布するためにこれを正確に行います。

0

hereと記載されているGCCバグのようです。

signed char c[] = ".";char c[] = ".";に変更すると、すべて正常に機能しているようです。