使用派生类进行c ++模板转换

时间:2010-01-26 03:56:14

标签: c++ templates solaris derived-class

#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它没有编译:{{1​​}}

2 个答案:

答案 0 :(得分:13)

std::pair有一个构造函数模板:

template<class U, class V> pair(const pair<U, V> &p);
  

“效果:从参数的相应成员初始化成员,根据需要执行隐式转换。” (C ++ 03,20.2.2 / 4)

从派生类指针到基类指针的转换是隐式的。

答案 1 :(得分:0)

因为B是从A派生的,所以向量v将包含指向对象b的基类结构的指针。因此,您可以访问A的成员,即

std::cout << v[0].first->a;

编辑: 我的错误,如下所述,你仍然可以转换为类型B的指针,因为向量是指针而不是对象,因此没有发生对象切片。

诸如

之类的电话
std::cout << v[0].first->b; 

不会编译,因为向量中的元素是基类指针,并且不能指向没有强制转换的派生类成员,即

 std::cout << static_cast<B*>(v[0].first)->b; 

还要注意动态强制转换,如

std::cout << dynamic_cast<B*>(v[0].first)->b;  

将无法在gcc中编译以下错误:

cast.cpp:14: error: cannot dynamic_cast ‘v.std::vector<_Tp, _Alloc>::operator[] [with _Tp = std::pair<A*, A*>, _Alloc = std::allocator<std::pair<A*, A*> >](0u)->std::pair<A*, A*>::first’ (of type struct A*’) to type struct B*’ (source type is not polymorphic)