Google测试:“从宽字符串初始化的字符数组”

时间:2011-08-12 17:55:29

标签: c++ googletest

我已经实现了类型参数化测试(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列表中定义的类型。

正如我已经说过的,如果我从std::istream列表中删除std::ostreamImplementations,我可以编译并运行测试而不会发出任何警告(我正在使用{{1标志)。任何人都能解释这种现象吗?

2 个答案:

答案 0 :(得分:0)

您的gtest库是否可能使用不同的版本编译器来构建您正在编译应用程序(stackoverflow.cpp)?我记得看到这个错误消息与我使用较新版本的gcc构建的lib相关,并尝试将其与旧版本的gcc链接。

您可以尝试从源代码构建gtest。它附带了一个脚本,可以将所有内容提取并融合到单个头文件和单个cpp文件中。

在你的gtest安装中查看这个python脚本:

gtest/scripts/fuse_gtest_files.py

脚本中有关于如何运行它的说明。你最终得到两个文件:

  • gtest-all.cc
  • gtest.h

您只需要执行一次并将其添加到makefile中。我这样做是为了向客户分发基于Linux的应用程序。

答案 1 :(得分:0)

看起来像GCC bug描述here

如果您将signed char c[] = ".";更改为char c[] = ".";,似乎一切正常。