Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数据成员';vec&x27;不能是成员模板_C++_Templates_Vector - Fatal编程技术网

C++ 数据成员';vec&x27;不能是成员模板

C++ 数据成员';vec&x27;不能是成员模板,c++,templates,vector,C++,Templates,Vector,为了声明包含模板的向量,我在标题中有以下两行: template <class t> std::vector <t> vec; 我做错了什么 编辑:我不知道我的理解是否正确,我正在尝试声明一个包含模板的向量,我知道这是可以做到的,因为可以有以下内容: template <class T> void funct(vector <T> v){ } 模板 无效函数(向量v){ } 此函数将模板的向量作为其参数。我希望做同样的事情,除了在标题中声明

为了声明包含模板的向量,我在标题中有以下两行:

template <class t>
std::vector <t> vec;
我做错了什么

编辑:我不知道我的理解是否正确,我正在尝试声明一个包含模板的向量,我知道这是可以做到的,因为可以有以下内容:

template <class T>
void funct(vector <T> v){

}
模板
无效函数(向量v){
}

此函数将模板的向量作为其参数。我希望做同样的事情,除了在标题中声明向量,以便允许向量包含任何内容。

向量始终需要一个类T作为模板。但是模板应该放在类声明之前

你可能是说

template<class T> 
class A {
private:
std::vector<T> vec;
};
模板
甲级{
私人:
std::vec;
};
只有在声明函数模板或类模板时才使用
模板
语句。例如,您可以在声明(和定义)类时使用它:

模板
类模板类{
/*定义*/
};
或函数:

template <typename T>
void templateFunc(T value) {
    /* definition */
}
int i = 1;
templateFunc(i); // <-- Automatic template deduction to int.
模板
无效模板函数(T值){
/*定义*/
}
创建类的实例时,不能使用
模板
语句。而是指定如下所示的模板参数:

TemplateClass<int> tc;
TemplateClass tc;
调用模板函数时:

template <typename T>
void templateFunc(T value) {
    /* definition */
}
int i = 1;
templateFunc(i); // <-- Automatic template deduction to int.
inti=1;

templateFunc(i);// 这样的向量不能包含任何内容

假设编译器允许您声明这样一个向量,并编写:

//...
A Aobj;
vec.push_back(Aobj);
//...
//...
B Bobj;
vec.push_back(Bobj);
//...
然后
vec
中一个元素的大小将是(A)
大小。但接下来你要写:

//...
A Aobj;
vec.push_back(Aobj);
//...
//...
B Bobj;
vec.push_back(Bobj);
//...
这里一个元素的大小是多少

无论如何,作为一种解决方法,您可以声明
vector-vec
,以便该向量可以包含指向您想要的任何内容的指针。

此答案适用于C++11及更早版本


没有模板化数据成员这样的东西。模板的唯一种类是类模板和函数模板。另一个例子是函数模板

试着想想有人会如何实例化你的类。假设这样做是合法的:

struct S
{
    template<typename T> 
    T x;
};

int main()
{
    S s;
    s.x = ????
}

你想干什么
std::vector
需要一个模板参数,但您没有提供。我的错误发布不正确。是的,但是
void*
将使他丢失所有类型信息。最好的方法是使用
Variant
(来自boost,或者自己实现)。@maximoudot我同意。C++11或14甚至支持自定义
类的
union
,无需使用其他库。C++17增加了对模板的支持variables@Michael实际上,它们是在C++14中添加的