我试图理解为什么我不能将派生类类型的列表传递给定义为获取基类类型的列表作为参数的函数。
#include <iostream>
#include <list>
using std::list;
class foo {
};
class bar : foo {
};
static void print_all(list<foo*> &L) {
}
void main() {
list<foo*> LF;
list<bar*> LB;
print_all(LB); // error
print_all(LF); // works fine
}
谢谢。
答案 0 :(得分:4)
std::list<foo*>
和std::list<bar*>
由于是模板,因此它们是完全无关的类型。但是,即使这与模板无关(您可以尝试通过继承显式安装这样的关系),也有充分的理由说明为什么它仍然不能很好地工作(假设将合法)。 ):
void f(std::list<foo*>& l)
{
l.push_back(new foo());
}
void g()
{
std::list<bar*> l;
f(l);
// now l contains a foo object that is not a bar one!!!
}
顺便说一句:您是否曾经注意到C ++ STL从未将容器传递给函数?您可以尝试相同的方法:
template <typename Iterator>
void print_all(Iterator begin, Iterator end)
{
for(; begin != end; std::advance(begin))
{
// print *begin
}
}
print_all(lf.begin(), lf.end());
print_all(lb.begin(), lb.end());
答案 1 :(得分:1)