4
#include <string> 
using String = std::string; 

class Base { 
protected: 
    String value; 
}; 

class Readonly : virtual Base { 
public: 
    const String& method() const { 
     return value; 
    } 
    String& method() { 
     return value; 
    } 
}; 

class Writeonly : virtual Base { 
public: 
    Writeonly& method(const String& value) { 
     this->value = value; 
     return *this; 
    } 
    Writeonly& method(String&& value) { 
     this->value = std::move(value); 
     return *this; 
    } 
}; 

class Unrestricted : public Readonly, public Writeonly {}; 

void usage() { 
    String string; 
    Unrestricted unrestricted; 
    unrestricted.method(string); // ambiguous 
    string = unrestricted.method(); // ambiguous 
} 

誰も私にこれらのメソッド呼び出しが曖昧である理由を説明することはできますか?これらのメソッド呼び出しはなぜ曖昧ですか?

「Writeonly」または「Readonly」のいずれかにまとめてもあいまいではありません。

私はこれをテンプレートベースのアクセサプロパティとして使用したいと考えています。したがって、私は "Writeonly"、 "Readonly"、 "Unrestricted"のインスタンスを使用できるようにしたいと考えています。

答えて

6

コンパイラが2つの異なるスコープで名前を検出したためです。

トリックはUnrestrictedの範囲の中に両方の名前をもたらすことです。

class Unrestricted : public Readonly, public Writeonly { 
    public: 
    using Readonly::method; 
    using Writeonly::method; 
}; 
0

おそらくあなたは関数のオーバーロードに考えているので、それがうまくいくと思います。問題は、異なる機能が異なるスコープにあることです。この場合、コンパイラには、適切な関数を選択するための関数のオーバーロードがありません。

この機能を使用するには、同じスコープに機能を追加する必要があります。

関連する問題