[英]Google Test: “char-array initialized from wide string”
我已經實現了類型參數化測試( 示例 #6 )以將相同的測試用例應用於多個 class。 碰巧將字符串分配給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
列表中刪除std::istream
或std::ostream
,我可以編譯並運行測試而不會發出任何警告(我正在使用-Wall
標志)。 誰能解釋這種現象?
是否有可能您的 gtest 庫是使用您正在編譯應用程序 (stackoverflow.cpp) 的不同版本編譯器構建的? 我記得看到此錯誤消息與我使用較新版本的 gcc 構建的庫相關,並嘗試將其與舊版本的 gcc 鏈接。
您可以嘗試從源代碼構建 gtest。 它帶有一個腳本,可以將所有內容提取並融合到一個 header 文件和一個 cpp 文件中。
在您的 gtest 安裝中查找此 python 腳本:
gtest/scripts/fuse_gtest_files.py
腳本中有關於如何運行它的說明。 你最終得到兩個文件:
您只需執行一次並將其添加到您的 makefile 中。 我這樣做是為了向客戶分發基於 Linux 的應用程序。
它看起來像這里描述的 GCC 錯誤。
如果你改變有signed char c[] = ".";
到char c[] = ".";
一切似乎都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.