我遇到下面的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似乎有问题。
感谢任何帮助, 谢谢 布赖恩
答案 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();
};