0

Aテンプレート化されたサブクラスが1つあるテンプレート親クラスを使用するこのコードがありますCAタイプ(T)をC取り、そのタイプ()のオブジェクトをT tテンプレートパラメータで受け取ります。私がやろうとしているのは、クラスの継承で、そのテンプレート引数Bを与え、オブジェクトを作成し、のメンバー関数を呼び出すことです。しかし、次のエラーが発生します。CbC.h

prog.cpp:10:44:エラー:テンプレートパラメータリストが多すぎます
prog.cpp:関数内'int main()'
prog.cpp:14:5:エラー:'B'このスコープで宣言されていません
prog.cpp:14:7:エラー:';'前に期待'b'

template <typename T> struct A {
    protected:
        template <T> struct C { 
            T h( T t ) { return t * t; }
        };
};

template <typename T = int> template <T t = 5> struct B : public A<T>::C<t> {};

int main() {

    B b;
    b.h();

}

オブジェクトをインスタンス化すると、エラーが呼び出されBます。私はいろいろなことを変えようとしましたが、それは状況を助けませんでした。たとえば、次のように変更しました。

template <typename T = int> template <T t = 5> struct B...

template <typename T = int> struct B...

と変更されました

: public A<T>::C<t> {};

: public A<T>::C<T t = 5> {};

しかし、私はさらに多くのエラーを受け取りました:

'C'prog.cpp:10:53:エラー:テンプレートとして使用されていない非テンプレート
prog.cpp:10:53:注:'A<T>::template C'テンプレートであることを示すために使用
prog.cpp:10:66:エラー:トークン prog.cppの'{'前に予期されます:関数内: prog.cpp:14:7:エラー:prog.cpp:14:7の前にテンプレート引数がありません:エラー:前に 予期されていました';'
'int main()
'b'
';''b'

また、最初に発生した一連のエラーについても興味がありB was not declared in this scopeます。どうしてできなかったのでしょうか?それは私が定義している方法Bですか?何が間違っているのでしょうか?

4

1 に答える 1

2

コードに2つの変更を加える必要があります。

// First you don't need and should not use 2 templates
template <typename T = int, T t = 5> struct B
    // C++ doesn't know that A<T>::C is a template so you should say it here
    : public A<T>::template C<t> {};
于 2012-10-21T15:18:10.180 に答える