2

テンプレート化されたクラス内にテンプレート化されたクラスがあります。メンバー関数をインラインで簡単に実装できますが、特定のケースでは、前方宣言の問題が発生しているため、宣言の後に実装する必要があり、その方法を忘れていたことに気付きました。

この小さな例を (定義をインラインに移動せずに) コンパイルできる場合、私の質問は次のように答えられます。

#include <iostream>

template <typename T, typename V>
struct Outer {

    template <int Count>
    struct Inner {
        void printer() const;
    };

};

template <typename T, typename V, int Count>
inline void Outer<T, V>::Inner<Count>::printer() const {
    std::cout << "Oh hai. I'm inner<" << Count << ">" << std::endl;
}

int main() {
    Outer<int, int>::Inner<3> i;

    i.printer();

    return 0;
}

編集:Stuartが修正した無関係なタイプミスを修正しました(答えをより明確にするのに役立ちます)

4

1 に答える 1

2

以下は、g++ 4.2.1 でコンパイルして動作します。(オンラインの Comeau コンパイラでもコンパイルできます。その価値はあります。) 主な変更点は、(a) 一貫してOuter正しいスペル、(b) 2 つのテンプレート パラメータ セットの分離、および (c) への変更CounterですCount

#include <iostream>

template <typename T, typename V>
struct Outer {

    template <int Count>
    struct Inner {
        void printer() const;
    };

};

template <typename T, typename V>
template <int Count>
void Outer<T, V>::Inner<Count>::printer() const {
    std::cout << "Oh hai. I'm inner<" << Count << ">" << std::endl;
}

int main() {
    Outer<int, int>::Inner<3> i;

    i.printer();

    return 0;
}
于 2012-05-05T00:00:53.293 に答える