模板问题,求同学们帮助。
问题1:
一个非模版类的 模板构造函数 如何初始化 如:
struct A1 {
template<int x> A1(): i(x) {}
int i;
};
template <int x>
struct A2 {
A2(): i(x) {}
};
有啥区别?
如何构造A1变量
A1 a1????
2: 下面的定义为啥不对?
enum TYPE
{ A, B,};
template <TYPE>
struct TT;
template <> struct TT<A> {}
template <> struct TT<B> {}
void ss(TYPE t, TT<t> x) {...}
[code=C/C++][/code]
[解决办法]
1. 区别: A1 定义的是一个普通类, 只是构造这个类型时用到了一个模版函数而已. A2 是一个模版类, 定义了一系列的类. 对于不同的 int 值, A1 只有一个类型, A2 却是不同的类型.
你没有办法构造出 A1 来, C++ 标准说明了构造函数的模版参数只能依赖于推导, 而你这个构造函数没有普通参数, 无法推导模版类型. 你必须给构造函数一个参数然后依赖于这个参数来推导出模版参数的类型.
2. 首先, 你少了分号. 其次, 更重要的是, 模版参数只能使用编译期的常量. 而 ss(TYPE t, TT<t> x) 中的 t 是一个运行期的值, 在编译的时候无法确定 t 的值, 所以不能作为模版的参数.
[解决办法]
#include <stdio.h>enum TYPE { AT, BT,};template <TYPE> struct Init ;//特化两个用于初始化Axtemplate <> struct Init<AT> {static const int i=1; };template <> struct Init<BT> {static const int i=2; };struct Ax{ template <TYPE t> Ax(Init<t>): a(Init<t>::i) {} int a;};int main() { Ax a((Init<AT>())); printf("%d", a.a);}