我已经实现了类型参数化测试(Sample #6)以将相同的测试用例应用于多个类。碰巧将字符串分配给 a 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::ostream
从Implementations
列表中删除,我可以编译并运行测试而不会发出任何警告(我正在使用-Wall
标志)。谁能解释这种现象?