3

次のコードが Windows でコンパイルされない理由の説明を探しています。

class TypeA {};

class TypeBInterface
{
public:
    ~TypeBInterface() {}
    virtual TypeA& TypeA() = 0;
};

class TypeB : public TypeBInterface
{
public:
    TypeA& TypeA() { return mTypeA; }
private:
    TypeA mTypeA;
};

TypeA戻り値の型とメソッド名の間には、ある種の名前の衝突がありTypeAます。次の戻り値の型は正常に機能します。

::TypeA& TypeA() { return mTypeA; }

この動作の原因となっている C++ の規則がわかりません。簡単な説明をいただけますか?


編集: @BalogPal は、より多くのコンテキストを要求しました。メソッドチェーンを使用してマップオブジェクトを構築しています。キーと値を追加するために、できることはlMap.Key(1).Value(2).Key(3).Value(4);. Key()新しいKeyオブジェクトを作成してマップに追加Key&し、新しいキーへの参照を返します。おそらく、後で明示的な型を取り除くことになるでしょうKeyが、今のところ、それが私が持っているものです。Key()私はvs のような簡潔さが好きCreateKey()で、この文脈でそれが何をするかは非常に理解しやすいと思います。

4

3 に答える 3

1

問題は名前を隠すことにあるため、実際には型の完全修飾名を使用するか、問題を回避する typedef を作成する必要があります。

于 2013-06-11T14:14:14.810 に答える