1

WinImp.hで。というエラーが発生します'Root' has not been declared。スコープ演算子()を使用しない場合class WinImp : public BaseDef、エラーはerror: expected class-name before '{' token)です。なぜこれが起こっているのか誰もが知っていますか?

Root.h

class Root {
    public:
        class BaseDef {
            public:
                virtual void foo() = 0;
                virtual void bar() = 0;
        };
    private:
        #ifdef _WIN32
        friend class WinImp;
        #else
        friend class NixImp;
        #endif

        BaseDef* imp;

        BaseDef* getImp();

    public:
        Root() : imp(getImp()) {}
        void foo();
        void bar();
};

Root.cpp

#include "Root.h"
void Root::foo() {
    imp->foo();
}

void Root::bar() {
    imp->bar();
}

WinImp.h

#ifdef _WIN32
#include "Root.h"
class WinImp : public Root::BaseDef {
    public:
        void foo();
        void bar();
};
#endif

WinImp.cpp

#include "WinImp.h"
#ifdef _WIN32
    void WinImp::foo() {

    }

    void WinImp::bar() {

    }

    Root::BaseDef* Root::getImp() {
        return static_cast<BaseDef*>(new WinImp());
    }
#endif
4

2 に答える 2

2

BaseDefルートでインターフェイスにアクセスしているため、公開されていると想定されます。

class BaseDef 
{
 public:
   virtual void foo() = 0;
   virtual void bar() = 0;
};

WinImp.cpp では、foo(), bar()戻り値の型が必要であり、それらはルート スコープ内にありません。次のようにする必要があります。

void WinImp::foo() { }
void WinImp::bar() { }
于 2013-01-25T22:15:09.823 に答える
2

次のように修正WinImp.cppします。

#include "WinImp.h"
#ifdef _WIN32
    // WinImp is not scoped within Root
    void WinImp::foo() {

    }

    void WinImp::bar() {

    }

    Root::BaseDef* Root::getImp() {
        return dynamic_cast<BaseDef*>(new WinImp());
    }
#endif
于 2013-01-25T22:20:43.287 に答える