2016-07-28 3 views
-2

の内部クラスの静的メンバを定義する:私は名前空間でプライベート静的メンバを持つクラスを持っている場合は別の名前空間

namespace A { 
class T { 
    public: 
     //functions 
    private: 
     static bool a; 
     static unsigned int b; 

そして、私は、次のような別のファイルにこのクラスのユニットテストをしています:

namespace { 

bool A::T::a = false; 
unsigned int A::T::b = 1; 

/* tests declaring an instance of A...*/ 

私はクランからのエラーが表示されます。

error: cannot define or redeclare 'a' here because namespace '' does not enclose namespace 'T' error: cannot define or redeclare 'b' here because namespace '' does not enclose namespace 'T'

私は静的なプライベートメンバーに関する他の答えと、クラスの宣言がどこにあるのかを宣言する必要性を見てきました。これは私がここでやっていると信じているものですが、エラーはまだ私を逃しています。

+0

'namespace {'は匿名です。宣言としての定義は '名前空間A 'で提案されましたが、そこではできません。 –

答えて

1

Iいいえ、私は私がここでやっていると信じて何をしている、静的なプライベートメンバーやクラスの宣言がある場合、それらを宣言する必要もありますので他の回答で

を見ている、あなたは、それをしないでください。宣言が "foo.h"にある場合、その定義は "foo.cpp"になければなりません。単体テストに使われるファイルではありません。

でも、エラーは依然として逃げ出します。

namespace { 

は、グローバルスコープは異なる匿名namespace、定義します。匿名で宣言された名前namespaceは、翻訳単位でのみ表示されます。匿名で定義されたものnamespaceは、namespaceでも宣言する必要があります。

を使用でき

bool A::T::a = false; 
unsigned int A::T::b = 1; 

まだよく、使用:

namespace A { 

    bool T::a = false; 
    unsigned int T::b = 1; 

をしていないユニットテストでは、.hファイルに対応する.cppファイル内のコードのこれらの行を入れてファイル。

関連する問題