10

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

template <class t>
std::vector <t> vec;

但是我收到以下错误:

data member 'vec' cannot be a member template

我做错了什么?

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

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

}

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

4

4 回答 4

8

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.
于 2013-08-13T03:01:39.583 回答
3

这样的向量不能包含任何东西。

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

//...
A Aobj;
vec.push_back(Aobj);
//...

那么其中一个元素的大小vec将是sizeof(A). 但接下来你写:

//...
B Bobj;
vec.push_back(Bobj);
//...

这里一个元素的大小是多少?

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

于 2014-05-28T06:14:26.860 回答
0

This answer applies to C++11 and earlier


There is no such thing as templated data members. The only sorts of templates are class template and function template. Your other example is a function template.

Try and think about how someone would instantiate your class. Suppose it was legal to do:

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

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

The type of S must be known in order to do S s;, it can't magically change to accommodate whatever type you decide to give to x. In fact you couldn't even evaluate s.x .

To solve your problem you have to make the template parameter be a template parameter of the class containing the data member, e.g.:

template<typename T>
struct S
{
    vector<T> vec;
};

int main()
{
    S<int> s;
    s.vec = vector<int>(5);
}
于 2014-05-28T06:25:35.327 回答
-1

Vector 总是需要一个类 T 作为模板。但是模板应该放在类声明之前。

你大概是说

template<class T> 
class A {
private:
std::vector<T> vec;
};
于 2013-08-13T02:43:07.427 回答