0

さて、なぜgccがこれをあいまいと呼ぶのか興味があります。これをチェックして:

class base_stream
{
public:
    std::string m_buffer;
};

class idatastream : public base_stream
{

};

class odatastream : public base_stream
{

};

class datastream : public idatastream, public odatastream
{
public:
    void dostuff( m_buffer = "some text";) // reference is ambiguous?
};

base_streamでm_bufferを1回だけ宣言し、継承クラスで再宣言しないのに、両方の継承クラスから継承すると、m_bufferがあいまいになるのはなぜですか?エラーはこれを言います:

||In member function 'void datastream::dostuff()':|
|22|error: reference to 'm_buffer' is ambiguous|
|6|error: candidates are: std::string base_stream::m_buffer|
|6|error: std::string base_stream::m_buffer|
||=== Build finished: 3 errors, 0 warnings ===|

有効な候補者が同じであるため、ここで混乱しています。dostuffの定義を次のように変更すると:

void dostuff() {base_stream::m_buffer = "test string";}

、それが示唆するように、私はこのエラーを受け取ります:

||In member function 'void datastream::dostuff()':|
|22|error: 'base_stream' is an ambiguous base of 'datastream'|
||=== Build finished: 1 errors, 0 warnings ===|

これが問題の核心にあると私が思うところです。同じクラスから継承する2つのクラスから継承することはできませんか?

4

1 に答える 1

1

仮想継承の使用idatastreamを継承odatastreamする必要があります。base_stream

したがって、このようなものが機能する可能性があります。

class base_stream
{
public:
    std::string m_buffer;
};

class idatastream : virtual public base_stream
{

};

class odatastream : virtual public base_stream
{

};

class datastream : public idatastream, public odatastream
{
public:
    void dostuff( m_buffer = "some text";) // reference is ambiguous?
};

したがって、この場合、のコピーは1つだけbase_stream内部に存在しdata_stream、でアクセスできるようになりm_bufferますdata_stream

私はあなたの質問に答えたと思います。

于 2012-04-10T22:22:21.827 に答える