如何创建模板向量
How to create a vector of Templates?
我试图构建模板类型的向量,但不断收到错误
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 中,您应该按值a
移入val
:
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
中。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么