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中添加的