c++使用派生类进行模板转换
#include <vector>
struct A {int a;};
struct B : public A {char b;};
int main()
{
B b;
typedef std::pair<A*, A*> MyPair;
std::vector<MyPair> v;
v.push_back(std::make_pair(&b, &b)); //compiler error should be here(pair<B*,B*>)
return 0;
}
我不明白为什么会编译(也许有人可以提供详细的解释?这与名称查找有关吗?
顺便说一句,在 Solaris、SunStudio12 上它无法编译:错误:形式参数 x 类型为 const std::pair & 调用 std::vector
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
std::pair
有一个构造函数模板:从派生类指针到基类指针的转换是隐式的。
std::pair
has a constructor template:Conversion from a derived class pointer to a base class pointer is implicit.
因为 B 是从 A 派生的,所以向量 v 将包含指向对象 b 的基类结构的指针。因此,您可以访问 A 的成员,即
编辑:
我的错误,正如下面指出的,您仍然可以转换为 B 类型的指针,因为向量是指针,而不是对象,因此没有发生对象切片。
诸如之类的调用
将不会编译,因为向量中的元素是基类指针,并且不能在没有强制转换的情况下指向派生类成员,即
还要注意动态强制转换,如
在 gcc 中不会编译并出现以下错误:
Because B is derived from A, the vector v will contain pointers to base class structures of the object b. therefore, you could access the members of A, i.e.
EDIT:
My mistake, as pointed out below, you can still cast to pointers of type B since the vector is of pointers, not objects, so no object slicing has occurred.
A call such as
will not compile since the elements in the vector are base class pointers and cannot point to derived class members without a cast, i.e.
Also note that a dynamic cast, as in
will not compile with the following error in gcc: