0

以下の typedef に問題があります。

template <typename T>
  struct myclass1 {
  static const int member1 = T::GetSomeInt();
};

template <int I>
struct myclass2 {
  typedef myclass1< myclass2<I> > anotherclass;
  static int GetSomeInt();
};

anotherclass MyObj1; // ERROR here not instantiating the class

anotherclass オブジェクトを初期化しようとすると、エラーが発生します。

私が間違っていることは何ですか?私のtypedefに問題があるようです。

どんな助けでも大歓迎です、ありがとうブライアン

4

2 に答える 2

3

あなたはanotherclass直接言及しています。その名前はそのスコープには存在しません。変数を次のように宣言する必要があります

myclass2<some_int>::anotherclass MyObj1;

wheresome_intは、パラメータ化する整数値ですmyclass2

の初期化子で使用できるように、myclass2<I>::GetSomeInt()としてマークする必要があると思います。constexprmyclass1<T>::member1

これらの調整により、次のコードは問題なくコンパイルされます。

#include <iostream>

template<typename T>
struct myclass1 {
    static const int member1 = T::GetSomeInt();
};

template<int I>
struct myclass2 {
    typedef myclass1<myclass2<I>> anotherclass;
    constexpr static int GetSomeInt() { return I; };
};

int main(int argc, char *argv[]) {
    myclass2<3>::anotherclass obj;
    std::cout << obj.member1 << std::endl;
}

これには C++11 for が必要であることに注意してくださいconstexprmyclass1<T>::member1C++03 が必要な場合は、合法ではないと思います。

于 2012-08-29T21:08:21.910 に答える
0

typedefパラメータとしてテンプレート化されたクラスを使用myclass1して渡すことを作成しています。したがって、テンプレートテンプレートパラメータを使用する必要があります。これは、の宣言をmyclass1に変更して、それ自体がテンプレートクラスTであることをコンパイラに通知する必要があることを意味します。template <typename T>

次のコードを変更するかどうかを確認します

template <typename T>
  struct myclass1 {
  static const int member1 = T::GetSomeInt();
};

これにより、問題が修正されます。

template < template <typename BasicType> class T>
  struct myclass1 {
  static const int member1 = T::GetSomeInt();
};
于 2012-08-29T21:34:27.837 に答える