我在标题中有以下两行,以声明包含模板的向量:
template <class t>
std::vector <t> vec;
但是我收到以下错误: 数据成员&#39; vec&#39;不能成为会员模板 我做错了什么? 编辑: 我不知道我被理解正确,我正在尝试声明一个包含模板的向量,我知道这可以通过以下方式完成:
template <class T>
void funct(vector <T> v){
}
这个函数采用模板的矢量作为它的参数,我希望做同样的事情,除了在标题中声明向量以允许向量包含任何东西。
答案 0 :(得分:5)
template <>
语句仅在声明 功能模板或类模板时使用。例如,您可以在声明(和定义)类时使用它:
template <typename T>
class TemplateClass {
/* definition */
};
或功能:
template <typename T>
void templateFunc(T value) {
/* definition */
}
创建类的实例时,不能使用template <>
语句。而是指定一个模板参数,如下所示:
TemplateClass<int> tc;
调用模板函数时:
int i = 1;
templateFunc(i); // <-- Automatic template deduction to int.
答案 1 :(得分:2)
此类载体不能包含任何内容。假设编译器允许您声明这样的向量,并编写类似
的代码//...
A Aobj;
vec.push_back(Aobj);
//...
然后vec中一个元素的大小为sizeof(A)
。但接下来你写了
//...
B Bobj;
vec.push_back(Bobj);
//...
这里一个元素的大小应该是多少?
无论如何,作为一种解决方法,您可以声明vector<void*> vec
这将包含指向您想要的任何内容的指针。
答案 2 :(得分:0)
Vector总是需要一个T类作为模板。但模板应该放在类声明之前。
你可能意味着
template<class T>
class A {
private:
std::vector<T> vec;
};
答案 3 :(得分:0)
此答案适用于C ++ 11及更早版本
没有模板化数据成员。唯一的模板类型是类模板和功能模板。您的另一个示例是函数模板。
尝试并考虑某人如何实例化您的课程。假设这样做是合法的:
struct S
{
template<typename T>
T x;
};
int main()
{
S s;
s.x = ????
}
必须知道S
的类型才能执行S s;
,它不能神奇地改变以适应您决定提供给x
的任何类型。事实上,你甚至无法评估s.x
。
要解决您的问题,您必须使模板参数成为包含数据成员的类的模板参数,例如:
template<typename T>
struct S
{
vector<T> vec;
};
int main()
{
S<int> s;
s.vec = vector<int>(5);
}