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

当我尝试初始化另一个类对象时,它给了我一个错误。

知道我做错了什么吗?我的 typedef 似乎有问题。

任何帮助表示赞赏,谢谢布莱恩

4

2 回答 2

3

你是anotherclass直接指的。该名称在该范围内不存在。您需要将变量声明为

myclass2<some_int>::anotherclass MyObj1;

some_int你想要参数化的任何整数值在哪里myclass2

我认为您还需要将其标记myclass2<I>::GetSomeInt()为存在,constexpr以便可以在myclass1<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 用于constexpr. 如果你想要 C++03,那么我不认为你myclass1<T>::member1是合法的。

于 2012-08-29T21:08:21.910 回答
0

您正在创建一个typedef使用myclass1并传入模板化类作为参数。因此,您需要使用模板模板参数。这意味着myclass1应该将 的声明更改为告诉编译器Tintemplate <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 回答