0

私は次のSOの質問を読みました:

ただし、静的メソッドと Visual-c++ と gcc の違いに関しては、少し異なる問題があります。

特定のタスクに関連するいくつかの静的メソッドをバンドルするクラスがあります。各メソッドの単純なバージョンを実装し、将来的にはより効率的な実装を可能にしたいと考えています。これを行うには、基本クラスにすべてのメソッドを実装し、派生クラスからメソッドを呼び出します。このようにして、「新しい」実装を持つメソッドは「古い」実装を隠します。私の問題は、あるメソッドg()が別のメソッドを呼び出すときf()に、派生クラスの実装が呼び出されていることを確認したいということです (存在する場合)。私のメソッドはすべて静的であるため、仮想メソッドを使用できません。visual-c++ では、次のコードが今説明したことを実行していますが、gcc はコンパイルされません。実際、visual-c++ が正常にコンパイルされることに驚いています。(両方でコンパイルするにはコードが必要です)

struct Base {
    static void f () {}
    static void g () { Derived::f(); } //--- visual-c++ compiles ok; gcc: "'Derived' was not declared in this scope"
};
struct Derived : public Base {
    static void f () {}
};

Derived::g ();

私の質問は、Visual-C++ が文句を言わないのはどうしてですか?コードを根本的に変更せずに gcc で解決するにはどうすればよいですか?

4

1 に答える 1

0

与えられた(そして、コメント/受け入れる機会を得る前に削除された)回答により、解決策がどれほど単純であるかがわかりました(つまり、私の質問がどれほど愚かでしたか:))

私がしなければならないのは、宣言を実装から分離することです(それはすべて単一の h ファイルにありました-悪いコーディング、私は知っています、それは永続的な「一時的な」解決策でした)

struct Base {
    static void f ();
    static void g ();
};

struct Derived : public Base {
    static void f();
};

int main() {
        Derived::g ();
        return 0;
}

void Base::f () {}

void Base::g () { Derived::f(); } 

void Derived::f() {}
于 2012-05-17T09:58:32.500 に答える