4

当我查看std::back_insert_iterator http://en.cppreference.com/w/cpp/iterator/back_insert_iterator

它说容器的 push_back 方法将被调用。它如何知道容器是否有 push_back 的方法?它是否需要一个扩展任何虚拟类的类,它在哪里定义?

4

7 回答 7

6

它说容器的 push_back 方法将被调用。它如何知道容器是否有 push_back 的方法?它是否需要一个扩展任何虚拟类的类,它在哪里定义?

不,push_back()通常不是虚拟方法。

std::back_insert_iterator是一个模板,它将调用push_back()传递的对象。如果缺少该方法,您将收到编译错误。

于 2013-10-31T08:17:57.683 回答
4

它并不神奇地知道这是真的。相反,如果它没有找到这样的函数,它将无法编译。

应该调用的操作(在这种情况下是赋值)push_back是使用编写push_back的,如果给定的容器没有具有该名称的函数,则该函数的调用根本不会编译。

于 2013-10-31T08:17:44.143 回答
4

它如何知道容器是否有 push_back 的方法?

它没有。如果您尝试在没有push_back.

它是否需要一个扩展任何虚拟类的类,它在哪里定义?

不,它只需要一个定义它的类。一般来说,模板不通过虚函数使用动态多态性。他们只要求他们包含的代码(如container.push_back(thing))在参数替换后有效。

于 2013-10-31T08:19:45.560 回答
2

如果您在谈论模板(作为模板发送的容器),那么编译器将尝试扩展模板,如果找不到该方法,它将失败。模板在编译时检查,因此编译会通知您容器没有您请求的方法...

于 2013-10-31T08:19:57.603 回答
1

它不知道,你应该知道。push_back您必须通过必须通过的容器std::back_insert_iterator。否则会导致编译错误。

例如,如果你将它用于 aset你会得到这个错误:

'class std::set' 没有名为 'push_back' 的成员

于 2013-10-31T08:18:33.997 回答
1

不,它不需要扩展类。

std::back_insert_iterator是一个模板;并且编译器会在他实例化它时找出您尝试使用模板的类型是否具有此方法。

我认为这种通过模板需要某个接口的类型称为隐式接口(尽管此时我找不到明确的参考)——与从某个(可能是抽象的)类派生的显式接口相反。

于 2013-10-31T08:19:14.607 回答
1

这是一个模板化的类。

它将在编译时生成代码。在编译时,它会在容器中寻找push_back函数。如果没有push_back,它将无法编译。

于 2013-10-31T08:19:22.697 回答