C++ 尝试从派生的向量指定基*的向量*
这似乎是一个相当基本的问题,但我无法解决。我有一个指向派生对象的原始指针的C++ 尝试从派生的向量指定基*的向量*,c++,pointers,inheritance,vector,C++,Pointers,Inheritance,Vector,这似乎是一个相当基本的问题,但我无法解决。我有一个指向派生对象的原始指针的std::vector,我只想使用赋值运算符将它复制到另一个基指针向量。使用VC++时,出现错误C2679“binary'=':未找到运算符…”顺便说一句,我不想要对象的深度副本,我只想复制指针。示例代码: #include <vector> using namespace std; struct Base{}; struct Derived: public Base {}; int main (i
std::vector
,我只想使用赋值运算符将它复制到另一个基指针向量。使用VC++时,出现错误C2679“binary'=':未找到运算符…”顺便说一句,我不想要对象的深度副本,我只想复制指针。示例代码:
#include <vector>
using namespace std;
struct Base{};
struct Derived: public Base {};
int main (int argc, char* argv[])
{
vector<Derived*> V1;
vector<Base*> V2;
V2 = V1; //Compiler error here
return 0;
}
所以我的问题是,为什么分配失败,而
推回
工作?对我来说也是一样。push\u-back
执行元素转换。赋值运算符仅存在于相同类型的向量之间
一个简单的解决方案是使用分配:
v2.assign(v1.begin(), v1.end());
这是因为虽然Base
和Derived
有关系,但vector
和vector
之间没有关系。就类层次结构而言,它们是完全不相关的,因此不能将一个分配给另一个
您正在寻找的概念称为。例如,在Java中,String[]
是Object[]
的一个子类型。但是在C++中,这两种类型只是不同的类型,它们与<代码>字符串[]/COD>和<代码> BAR< /COD>无关。p>
push_-back
有效,因为该方法只需要一个T常量&
(或T&
),所以任何可转换为基*
的东西都是可以接受的,而派生*
就是这样
也就是说,vector
有一个构造函数,它使用一对迭代器,在这里应该更容易使用:
vector<Base*> v2(v1.begin(), v1.end());
在模板的一般情况下,如果您有一个类模板
template <typename T> struct Foo {};
模板结构Foo{};
Foo
不是Foo
的基类
因此,您不能:
Foo<Derived> f1;
Foo<Base> f2 = f1;
Foo-f1;
Foo f2=f1;
我想如果赋值操作符必须接受不同但相关类型的向量,它会变得过于复杂。这也是一个(非常常见的)C++常见问题解答。请参阅。在C#中,列表
也与列表
无关,但是IEnumerable
是IEnumerable
的一个子类型,因为IEnumerable
是变量。@usr协变的。与常见问题解答示例一起,这并不违反类型安全性,因为IEnumerable
是只读接口,因此不能破坏向量。然而,我们可以想象在一个系统中,向量
仍然是不变的,但是存在一个常数向量
,它可能是协变的。
template <typename T> struct Foo {};
Foo<Derived> f1;
Foo<Base> f2 = f1;