C++ 如何将算术运算符添加到std::array?
我希望继承所有的方法,包括std::array的构造函数。我试着C++ 如何将算术运算符添加到std::array?,c++,c++11,c++14,c++17,stdarray,C++,C++11,C++14,C++17,Stdarray,我希望继承所有的方法,包括std::array的构造函数。我试着 template<class T, size_t N> class Vec : public array<T, N> { public: using array<T, N>::array; Vec operator+(Vec const& rhs) const { Vec res; transform(begin(), end()
template<class T, size_t N>
class Vec : public array<T, N>
{
public:
using array<T, N>::array;
Vec operator+(Vec const& rhs) const
{
Vec res;
transform(begin(), end(), rhs.begin(), res.begin(), plus);
return res;
}
};
模板
类Vec:公共数组
{
公众:
使用array::array;
向量运算符+(向量常量和右行)常量
{
Vec-res;
变换(begin()、end()、rhs.begin()、res.begin()、plus);
返回res;
}
};
但是有一些编译错误
vecv{1,2}代码>像std数组一样,甚至构造函数也会被继承
我可能误解了一些事情。如何解决这些错误。在std::array上添加算术运算符是否有更好的方法。谢谢 好的,等等,原因很复杂,但不用担心,解决办法很简单。继续读下去
array
是一个模板,因此类array
的成员在模板实例化之前是未知的(请记住,模板可以专门化)。由于begin
似乎不依赖于任何模板参数,因此在array
实例化之前,即在array
的成员已知之前,在第一阶段查找时解析其名称。这就是为什么会出现begin
未找到或类似错误的原因
简单的解决方案是使用this->begin
。这种方式begin
将在第二阶段查找时解决(在std::array
实例化之后),因为现在很清楚begin
可以是继承模板类的成员
而且,在C++17中,plus
应该是plus{}
或plus{}
建议:尽量避免使用命名空间std
如果只需要为std::array添加算术运算,我认为不需要为此创建类。您可以只定义非成员模板操作符,而不直接访问std::array实现
template <typename T, size_t N>
auto operator+(const array<T, N>& ob1, const array<T, N>& ob2)->array<T, N> {
array<T, N> res;
for (int i = 0; i < N; ++i)
res[i] = ob1[i] + ob2[i];
return res;
}
模板
自动运算符+(常量数组和ob1、常量数组和ob2)->数组{
阵列分辨率;
对于(int i=0;i
其他算术运算也是如此。首先你有一个输入错误(res应该是rhs),第二个std::plus是一个类型,transform需要该类型的一个实例,第三个你需要在begin&end前面使用这个->(我想是关于两阶段查找的吧?)。第四,光明说了些什么。删除using array::array来修复brace init(我不知道为什么,但我认为这与array没有用户定义的ctor有关?)。。。如果这是一个很好的例子,那么任何想要复制/粘贴它的人都不需要提供所有其他的东西。小心,我认为它还不适用,但是我总是有一个容器而不是一个容器,以防有人试图扩展这个类。谢谢,我仍然想知道为什么不能使用聚合初始化Vec v{1,2}代码>。我正在使用VS2017。我正在我的命名空间中使用命名空间std。不确定这是正常的还是不好的做法。@user1899020因为Vec
不是使用名称空间std主题的聚合,模板仍然必须在标题中,对吗?因此,这并不局限于编译单元。你强迫每个使用这个的人把所有的std放在他们的名称空间中。或者您可以多次编写“std::”,这似乎是一个合理的负担。或者只需使用,无需创建新类