如何创建模板向量

How to create a vector of Templates?

本文关键字:向量 建模 何创      更新时间:2023-10-16

我试图构建模板类型的向量,但不断收到错误

 template<class T>
 struct s{
    T val;
    public:
        s(T a)
        {
            val = a;
        };
        friend ostream& operator<<(ostream& os, const T& a);
 };
 template <typename T>
 ostream& operator<< (ostream& os, const T& a){
     return os << a.val;
 }
int main()
{
    s <double> names(4) ;
    s <int> figure(7);
    s <string> word();
    s <vector<int>*> arrays();
    cout << names << endl;
    cout << figure << endl;
    cout << arrays << endl;
    return 0;
}

我一直收到同样的错误 -

request for member 'val' in 'a', which is of non-class type 's<std::vector<int>*>()'|

任何建议将不胜感激

s <vector<int>*> arrays();

声明一个名为 arrays 的函数,不带参数并返回s<vector<int>*>。删除多余的括号或将其替换为 C++11 的{}。当然,您的s不支持默认构造,因此您需要为其提供一个默认构造函数 - 这可以像为构造函数提供默认参数一样简单:

    s(T a = T())
    {
        val = a;
    }

最好使用成员初始化列表而不是赋值,并采用 const ref 而不是 by 值,因为T可能很大:

    s(const T& a = T()) : val(a) { }

在 C++11 中,您应该按值aval

     s(T a = T()) : val(std::move(a)) { }

 template <typename T>
 ostream& operator<< (ostream& os, const T& a){
     return os << a.val;
 }

会匹配阳光下的一切。最好只匹配s

 template <typename T>
 ostream& operator<< (ostream& os, const s<T>& a){
     return os << a.val;
 }

最后

friend ostream& operator<<(ostream& os, const T& a);

与简单函数而不是函数模板交朋友(并声明(。要与模板交朋友,operator <<如上修改:

    template <typename U>
    friend ostream& operator<<(ostream& os, const s<U>& a);

或者更好的是,删除模板运算符并内联定义友元函数(在类定义内(:

    friend ostream& operator<<(ostream& os, const s<T>& a){
        return os << a.val;
    }

这更紧凑,并且还将友谊限制在operator <<的匹配版本,而不是模板的所有实例化。

演示。

s <vector<int>*> arrays();

这不会实例化对象,而是声明一个返回 s<vector<int>*> 的函数,因此:

cout << arrays << endl;

尝试通过实例化模板化operator<<来打印出函数指针:

template <typename T>
ostream& operator<< (ostream& os, const T& a){
    return os << a.val;
}

跟:

T = s<vector<int>*>(*)();

因此,指向函数a的指针没有触发错误的.val字段。

整个问题是这个

ClassName InstanceName();

不是使用默认构造函数创建ClassName实例,而是声明一个函数。为了做你想要的(我假设是使用默认构造函数创建实例(,使用语法

ClassName InstanceName;

因此,为了修复您的错误,请更改

s <string> word();
s <vector<int>*> arrays();

s <string> word;
s <vector<int>*> arrays;

并将默认构造函数添加到类s 中。