我有像......这样的课程。
class BaseNode {
// ...
public:
virtual void save(std::ofstream &);
};
class InputNode : public BaseNode { ... } // no virtual save
class BiasNode : public BaseNode { ... } // no virtual save
我将它们存储在这个载体上......
std::vector<std::shared_ptr<BaseNode>> nodes;
nodes.push_back(make_shared<BaseNode>(InputNode()));
nodes.push_back(make_shared<BaseNode>(BiasNode()));
但以下不起作用......
for (auto n = nodes.begin(); n != nodes.end(); ++n)
n->save(outfile);
../../../../src/libs/ann/base-net.cpp:40:6: error: ‘class std::shared_ptr<BaseNode>’ has no member named ‘save’
然而BaseNode确实有一个save()函数,我觉得我在迭代中做错了。
我确实有从BaseNode继承的其他类包含它们自己的虚拟保存函数,但在这种情况下(其中InputNode和BiasNode没有定义它们自己的)我希望InputNode和BiasNode调用BaseNode :: save()。
思想?
答案 0 :(得分:3)
nodes.begin()
返回一个迭代器,因此您需要取消引用迭代器才能到达该对象。
for (auto n = nodes.begin(); n != nodes.end(); ++n)
(*n)->save(outfile);
也只是一个提示:将参数设为save
一个std::ostream&
。如果输出流不是文件,这会使save
函数更具灵活性。
答案 1 :(得分:1)
你应该取消引用迭代器。
有两种方法可以解决您的问题:最简单的方法是:
for (auto n: nodes)
n->save(outfile);
另一种方法是将迭代器转换为对向量元素的引用(指向对象的指针):
for (auto n = nodes.begin(); n != nodes.end(); ++n) {
auto &el = *n;
el->save(outfile);
}
但是,为什么要存储指针?为什么不简单地将对象存储在向量中?
std::vector<BaseNode> nodes;
nodes.push_back(BiasNode());
nodes.push_back(InputNode());
for (auto n: nodes)
n.save();
答案 2 :(得分:0)
for (auto n = nodes.begin(); n != nodes.end(); ++n)
n->save(outfile); //here's the issue
这里,n是迭代器。取消引用它就像这样使用:
(*n)->save(outfile);
或者简单地说(在C ++ 11之后)
for (auto n : nodes)
n->save(outfile);
答案 3 :(得分:-1)
您可以使用:
TYPE& dynamic_cast<TYPE&> (object);
要尝试找出你在循环中调用的类,然后调用你希望拥有它的类的方法。