2011-08-12 104 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[] = ".";一切似乎都工作得很好。