我希望继承所有方法,包括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(), rhs.begin(), res.begin(), plus);
return res;
}
};
但是出现了一些编译错误。
Vec<int, 2> v{1, 2};
。我可能会误会。如何解决这些错误。在std :: array上添加算术运算符的任何更好的主意。谢谢!
答案 0 :(得分:2)
好吧,等等,原因很复杂,但是不用担心,解决方案很简单。继续阅读。
array
是模板,因此在模板实例化之前不知道类array<T, N>
的成员(请记住,模板可以是专门的)。并且由于begin
似乎不依赖于任何模板参数,因此其名称在array<T, N>
的实例化之前(即array<T, N>
的成员已知之前)的第一阶段查找中被解析。这就是为什么您找不到begin
或类似错误的原因。
简单的解决方案是使用this->begin
。这样begin
将在第二阶段查找(实例化std::array<T, N>
之后)得到解析,因为现在很明显begin
可以是继承的模板类的成员。
此外,在C ++ 17中,plus
应该是plus<>{}
或plus{}
。
一个建议:避免使用using namespace std
Why is "using namespace std" considered bad practice?
答案 1 :(得分:0)
如果您只需要为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;
}
对于其他算术运算,依此类推。