typedef的模板,模板类型作为参数

时间:2012-08-29 21:06:44

标签: c++ typedef

我遇到下面的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似乎有问题。

感谢任何帮助, 谢谢 布赖恩

2 个答案:

答案 0 :(得分:3)

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

myclass2<some_int>::anotherclass MyObj1;

其中some_int是您要使用。{/ p>参数化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;
}

注意,这需要constexpr的C ++ 11。如果您想要C ++ 03,那么我认为您的myclass1<T>::member1不合法。

答案 1 :(得分:0)

您正在使用typedef创建myclass1并传入一个templatised类作为参数。因此,您需要使用模板模板参数。这意味着应该将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();
};