我会劝阻你不要这样做。如果您需要一个新容器,只需嵌入(或私下继承)std::vector<>
而不是公开继承。
关于您的问题:
1)调用我的派生类向量(当然是在另一个命名空间内)是不是一个坏主意?在这种情况下我会遇到什么样的冲突?
只要您和您的任何客户都不会std
通过指令同时导入名称空间和您的名称空间using
,我看不出这有什么特别的问题。
2) 我想重载数学运算符,以便能够添加向量、将向量乘以常数等。这实际上是我决定在 std::vector 之上构建一个向量类的原因。但是,我可以直接重载 std::vector 的数学运算符,省去创建(又一个......)向量类的麻烦——但这是个坏主意吗?
是的,这是个坏主意。如果您为 创建了数学运算符的重载,则std::vector
无法在std::vector
所属的命名空间中创建它们。通过 ADL,operator +
即使不合适,也可能在该名称空间中找到一个全局变量。如果是这种情况,你operator +
甚至不会被查找,你会得到一个编译器错误。
3) 我非常想从 std::vector 继承构造函数,但是在没有编译器错误的情况下完成这项工作时遇到了很多麻烦。有人可以为我提供一个具体的例子,向我展示如何做到这一点?
在 C++11 中,您可以使用继承的构造函数。例如:
#include <vector>
template<typename T, typename Allocator = std::allocator<T>>
class myvector : public std::vector<T, Allocator>
{
using typename std::vector<T, Allocator>::vector;
};
#include <iostream>
int main()
{
std::vector<int> vi { 1, 2, 3, 4, 5};
// Uses inherited constructor
myvector<int> v(vi.begin(), vi.end());
for (auto i : v) { std::cout << i << " "; };
}
这是一个使用 GCC 4.8.0 (beta) 的活生生的例子,它支持继承的构造函数。