我想访问类外的模板参数。我通常这样做:
template <class T>
class A
{
typedef typename T T;
}
A<int>::T;
我希望能够对非类型模板参数执行相同的操作。这不起作用:
template <int T>
class A
{
typedef typename T T;
}
A<3>::T;
我将澄清为什么我需要这个。我想按如下方式定义第二个类:
template <class C>
class B
{
static int func() {return C::T;}
}
B<A<3> >::func();
这样做的正确方法是什么? 非常感谢你。
答案 0 :(得分:5)
那是因为T
不是类型名称而你不能typedef
。它是int
值,如果要将其作为类的静态成员访问,则需要静态成员int
。看起来你真正想要的是这个:
template <int T>
class A
{
public:
static const int x = T;
};
doSomething(A<5>::x);
答案 1 :(得分:2)
它是一个值,而不是一个类型,所以也许:
template <int T>
class A
{
static const int param = T;
};
然后您可以A<42>::param
访问它。并非它有多大帮助,除非A本身在其他地方用作模板参数。
答案 2 :(得分:1)
在第二种情况下,T
不是类型,它是int
值。因此,您应将其定义为 const int
或static const int
值。
template <int T>
class A {
static const int T = T;
};
请注意,习惯使用T
表示类型(特别是当模板是monadic时,因为类型没有歧义),以及常量的其他名称,通常是更有意义的名称,例如SIZE
或最好Size
(所有大写符号最适合用于宏)。
template <int Param>
class A {
static const int param = Param;
};
有关在模板定义的上下文中使用static const
值,请参阅其他SO问题(例如this one)。