C++ C++;知道container类有push_back函数吗?

C++ C++;知道container类有push_back函数吗?,c++,C++,当我查看std::back\u insert\u迭代器时 它表示将调用容器的push_back方法。它如何知道容器是否有推回的方法?它需要一个扩展任何虚拟类的类吗?它在哪里定义的?它不知道这是真的。相反,如果找不到这样的函数,它将无法编译 应该调用push_back的操作(本例中的赋值)是使用push_back编写的,如果给定的容器没有具有该名称的函数,则该函数的调用将无法编译 它表示将调用容器的push_back方法。它如何知道容器是否有推回的方法?它需要一个扩展任何虚拟类的类吗?它在哪里定义

当我查看
std::back\u insert\u迭代器时


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

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

应该调用
push_back
的操作(本例中的赋值)是使用
push_back
编写的,如果给定的容器没有具有该名称的函数,则该函数的调用将无法编译

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

不,
push_-back()
通常不是虚拟方法


std::back\u insert\u迭代器是一个模板,它将对传递的对象调用
push\u back()
。如果该方法丢失,您将得到一个编译错误。

它不知道,您应该知道它。您必须将具有
push\u back
的容器传递到
std::back\u insert\u迭代器
。否则,将导致编译错误

例如,如果将其用于
集合
,则会出现以下错误:

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


不,它不需要扩展类

std::back\u insert\u迭代器
是一个模板;当他实例化模板时,编译器会发现你试图使用模板的类型是否有这个方法


我认为这种通过模板需要特定接口的类型被称为隐式接口(尽管我现在找不到一个明确的引用)——与从某个(可能是抽象的)类派生出来的显式接口相反。

它是一个模板化的类

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

它如何知道容器是否有推回的方法

没有。如果您试图在没有
push\u back
的容器上使用它,则会出现编译错误

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


不,它只需要一个定义它的类。通常,模板不通过虚拟函数使用动态多态性;它们只需要包含的代码(如
容器。push_back(thing)
)在参数替换后才有效。

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

因为它编译成功。