2011-08-12 139 views
2

我已經實現類型參數測試(Sample #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 

更有趣的是在應用測試用例一個類型時,一切順利就好了,但是當我添加它爆炸的第二種類型。我可以重現該錯誤在以下代碼:

#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列表中定義。

正如我已經說過,如果我從Implementations名單我可以編譯,沒有任何警告(我用的是-Wall標誌)進行的測試,要麼刪除或std::istreamstd::ostream。誰能解釋這種現象?

+0

你使用什麼編譯器? – Poodlehat

+0

我不能看到谷歌的試驗場地的代碼,因爲我不得不在工作中使用一個古老的瀏覽器,但在我看來,當你只包括一個,由於某些原因而使用字符的字符串,但是當你包括它使用的是wchar_t字符串。我會研究如何擴展模板以尋找線索。 – Poodlehat

+0

第32行是'signed char c [] =「。」;'?這是我看到的唯一的'char'。 – MSalters

回答

0

是有可能你的GTEST庫是在不同版本的編譯器,你用你的編譯應用程序(stackoverflow.cpp)建?我記得看到這個錯誤消息與我用新版本的gcc構建的lib有關,並試圖將它與舊版本的gcc鏈接起來。

你可以嘗試從源代碼構建GTEST。它帶有一個腳本,可將所有內容提取並融合成一個頭文件和一個cpp文件。

看着你GTEST安裝此python腳本:

gtest/scripts/fuse_gtest_files.py 

有腳本指令如何運行它。你結束了兩個文件:

  • gtest-all.cc
  • gtest.h

你只需要一次做到這一點,並把它添加到你的makefile。我這樣做是爲了向客戶分發基於Linux的應用程序。

0

它看起來像GCC的bug描述here

如果更改signed char c[] = ".";char c[] = ".";一切似乎都工作得很好。