を得ましたstring.cpp):私は2つの異なるのCPPに静的なconstメンバ変数にアクセスする、私は非テンプレートクラスString(string.hのを)持っている「複数の定義」
const unsigned int String::npos = static_cast<unsigned int>(-1);
私は別のcppsで文字列を使用すると、私は複数の定義エラーがあります。
STLでstd :: stringのコードを読みました。
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
{
public:
...
/// Value returned by various member functions when they fail.
static const size_type npos = static_cast<size_type>(-1);
...
そして、いくつかの機能の実装はbasic_string.tccであり、また、このファイルの「NPO法人」の宣言::のbasic_stringは、こと好き
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#if _GLIBCXX_USE_CXX11_ABI
template<typename _CharT, typename _Traits, typename _Alloc>
const typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::npos;
...
しかし、私はSTDを使用する場合: :string、エラーは発生しません。
なぜSTLにエラーはありませんが、私はそこで間違っています。それを修正するには?ありがとうございました。
更新:
実は、私は私のクラスをテストするためにGTESTを使用します。
私は、文字列-impl.hファイルに実装string.cppファイルを変更し、それは動作しません。
string-indexof-char-test.cc:
#include "string-def.h"
#include "string-impl.h"
#include <gtest/gtest.h>
TEST(IndexOfTest, CharTest) {
String str = "123456";
EXPECT_EQ(str.IndexOf('0'), String::npos);
}
string-indexof-sequence-test.cc:
#include "string-def.h"
#include "string-impl.h"
#include <gtest/gtest.h>
TEST(IndexOfTest, CharTest) {
String str = "123456";
EXPECT_EQ(str.IndexOf("000"), String::npos);
}
私は単純に(他のテストは無関係であるすべての私のテストを実行します)、エラーが発生します。
CMakeFiles\tests.dir/objects.a(string-indexof-char-test.cc.obj):string-indexof-char-test.cc:(.rdata+0x640):
multiple definition of `citron::String::npos'
CMakeFiles\tests.dir/objects.a(string-indexof-sequence-test.cc.obj):string-indexof-sequence-test.cc:(.rdata+0x230): first defined here
collect2.exe: error: ld returned 1 exit status
エラーメッセージを記載してください。 – LogicStuff
問題を再現する[MCVE]を設定できますか?あなたは適切なヘッダーの警備員を持っていますか? – user0042
テストコードに実装ファイルを含める必要はありません。テストランナーにリンクするだけです。テンプレート実装の場合は – user0042