2017-08-12 3 views
-1

を得ました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 
+0

エラーメッセージを記載してください。 – LogicStuff

+1

問題を再現する[MCVE]を設定できますか?あなたは適切なヘッダーの警備員を持っていますか? – user0042

+0

テストコードに実装ファイルを含める必要はありません。テストランナーにリンクするだけです。テンプレート実装の場合は – user0042

答えて

1

おそらく、header.hのstring guardのガードに間違いがあります。 #pragma onceを使用して問題を解決できます。

#pragma once 

class String { 
public: 
    static const unsigned int npos; 
    ... 
}; 
関連する問題