1

私は現在、後で実装される抽象インターフェイスを持つ C++ プロジェクトに取り組んでいます。インターフェースには、私の実装がオーバーライドしない実装されたメソッドもあります。私の問題は、実装を使用すると、コンパイラ (MSVC) がインターフェイス メソッドを認識しないことです。これは何が原因で、どうすれば解決できますか?

これがコードです。

#include <string>
#include <vector>
using std::string;

class A
{
    public:
    string name;
};

class interface
{ 
public:
    virtual int num_foo() = 0;
    virtual A* foo(int) = 0;
    virtual A* foo(string &name){
        for ( int i(0); i < num_foo(); i++)
            if ( foo(i)->name == name )
                return foo(i);
        return 0;
    }
};

class implementation : public interface
{
public:
    virtual int num_foo() { return m_foos.size(); }
    virtual A* foo(int i) { 
        //check range 
        return &m_foos[i];
    }
    std::vector<A> m_foos;
};

int main(...)
{
    implementation impl;
    // impl is properly initialized here

    string name( "bar" );
    // here comes my problem, the MSVC compiler doesn't see foo(string &name)
    // and gives an error
    A *a = impl.foo( name );
}
4

4 に答える 4

5

名前解決は、オーバーロード解決の前に行われます。ではimpl.foo( name )、コンパイラはimplementationクラスを見て、 のみを見つけvirtual A& foo(int i)ます。正しい名前の関数が見つかったため、基本クラスは調べません。

この使用を修正するには、派生クラスに宣言を追加して、オーバーロードの解決のために、using interface::fooすべての基本バージョンを派生クラスにプルします。foo通常、オーバーロードされた関数は避けたいと思います。おそらく、fooさまざまな関数名のバリアントを付けるでしょう。

string(その他のエラーは、 、vectorまたはを定義していないことです。参照の代わりにm_ones使用しようとしたり、 への参照を返す関数で 0 を返そうとしたりします。)->.A

于 2009-09-04T07:29:35.243 に答える
3

オーバーロードのためにサブクラスで基本メソッド (foo(string) など) を再公開するには、追加します。

  using interface::foo;

クラスの実装に。

于 2009-09-04T07:35:29.040 に答える
1
class implementation : public interface{
    public:
       using interface::foo;
       int num_foo() { return m_foos.size(); }
       A& foo(int i)
       {   //check range
           return m_ones[i];
       }
       vector<A> m_foos;
       vector<A> m_ones;
};
于 2009-09-04T07:38:31.730 に答える