1

このコードを見てください:

struct foo {
    virtual int bleh() {
        return 42;
    }
};


template<typename T>
struct bar : public foo {

};

// ERROR
template<>
int bar<char>::bleh() {
    return 12;
}

base::blehfor のみの定義を提供しようとしていますbar<char>が、コンパイラ (gcc 4.7.2)は次の診断でコードを拒否します。

template-id ‘bleh<>’ for ‘int bar<char>::bleh()’ does not match any template declaration

base::blehに何かが隠されているようですbar。で次の定義を使用してこれを修正しましたbar

template<typename T>
struct bar : public foo {
    // doesn't work
    //using foo::bleh; 

    // this works
    int bleh() {
        return foo::bleh();
    }
};

しかし、これがコンパイルに失敗する理由については興味があります。コンパイラがコードを拒否するのはなぜですか?

4

1 に答える 1

4

非コンパイルの例では、テンプレート定義で宣言されていない関数を特殊化して定義しようとしていbarます... 後の例では、実際に非特殊化バージョンの宣言と定義を行っていますのテンプレート定義内の関数bar。これがコンパイルされる理由です。私が知る限り、最初のバージョンがコンパイルされない理由 (14.7.3/4) に関する標準の関連言語は次のとおりです。

メンバー関数、メンバー関数テンプレート、メンバー クラス、メンバー列挙、メンバー クラス テンプレート、またはクラス テンプレートの静的データ メンバーは、暗黙的にインスタンス化されるクラスの特殊化に対して明示的に特殊化することができます。この場合、クラス テンプレートの定義は、クラス テンプレートのメンバーの明示的な特殊化に先行するものとします。

于 2013-05-10T01:15:34.863 に答える