我想做这样的事情:
template<template<int d, class>
class container,
int dim = d, typename content_data_type>
class MyClass {
};
我的编译器告诉我这是不可能的,因为“d”没有定义在:
之外template<int d, class> class container
还有其他方法吗?
提前感谢您对此主题的任何帮助。
更新
@ Rook:我希望稍后在专业化中访问“dim”和“content_data_type”参数
e.g。
普通班:
template<template<int d, class>
class container>
class MyClass {
};
规格。类:
template<>
class MyClass<vec> {
vec c; // Error: vec needs template parameters
};
这给了我一个错误,因为我使用了我的模板类“vec”whitout模板参数,我希望编译器推导出模板参数,例如当我使用
MyClass<vec<3, float> >
然后变量“c”应该具有类型
vec<3, float>
因为这不起作用,我想我可以创建两个激活模板参数“dim”和“content_data_type”,我可以在这样的专业化类中访问:
template<template<int d, class t>
class container,
int dim = d, typename content_data_type = t>
class MyClass<vec> {
vec<dim, content_data_type> c;
};
...再次抱歉,对于最初的问题不够具体:)
答案 0 :(得分:3)
我认为你所做的事情没有意义,所以答案是“不”。
模板参数container
是类模板,而不是类。当MyClass
被实例化时,它的参数是整个模板,而不仅仅是它的一个实例。因此,无法将MyClass
的维度默认为“container
的维度”,因为container
没有自己的模板参数的值。您的班级MyClass
可以使用container
的不同值创建和使用d
的一个或多个实例,但特别是没有给出任何一个,它会给出模板。< / p>
通过类比,假设您将指向函数的指针f
作为参数传递给函数g
。然后,您无法在f
的定义中使用“传递给g
”的参数。函数g
可以使用不同的参数调用f
一次或多次,但特别是没有任何一个调用,它被赋予了函数。
来自您的更新:
e.g。当我使用
时MyClass<vec<3, float> >
你不使用MyClass<vec<3, float> >
,没有这样的事情。正如我所说,MyClass
需要模板而不是类。 vec
是一个模板,vec<3, float>
是一个类。听起来好像你根本不需要模板作为模板参数。
答案 1 :(得分:2)
通常容器会暴露暗淡的成员,所以这可以工作:
template< template< int, class> class container, int dim, class content_data_type >
class MyClass
{
public:
typedef typename container< dim, content_data_type > container_type;
static const int dim = container_type::dim;
};
template< int d, class >
class acontainer
{
public:
static const int dim = d;
};
MyClass< acontainer, 2, sometype > x;
std::cout << "container size " << x.dim << std::endl;
答案 2 :(得分:0)
下面是一种解决方法,您必须将两个参数定义为容器类公开的类型和静态(请参阅示例boost::array
)
#include <iostream>
template <int d, class T>
struct container
{
typedef T value_type;
static const int static_size = d;
};
template<typename cont, int d = cont::static_size, class T = typename cont::value_type>
struct A
{
static const int dimension = d;
};
int main(void)
{
A<container<10, int> > a;
std::cout << a.dimension << std::endl;
}