当前位置: 首页 > 知识库问答 >
问题:

C++如何知道模板类在编译时支持哪些方法?

党宇定
2023-03-14
template <typename T>
void func(){
  T* t = new T();
  t->do_something();
  ...
}

在这种情况下,编译器如何知道typename T将在其上定义一个方法do_something()?在Java中,我们可以指定泛型类扩展的接口,但C++显然没有相同的语法。那么,如果我们调用func () 会发生什么呢?

共有1个答案

邓德惠
2023-03-14

在您实例化模板函数之前,编译器并不知道...使用t。然后它将查找t是否有这样的方法...如果不是,您将得到一个错误。

想想像占位符这样的模板类型,在用类型实例化模板函数之前,不会为模板函数生成代码。因此,如果您有这样的函数并且它从未被调用,尽管它仍将接受编译器的一些语法一致性检查,但它将不是程序集的一部分。这是模板的许多特性之一。

当调用func () 时,编译器将typename t替换为aclassthatdoesnthavedoSomethingDefinited。它将尝试创建一个如下所示的函数:

void func(){
  AClassThatDoesntHaveDoSomethingDefined* t = new AClassThatDoesntHaveDoSomethingDefined();
  t->do_something();
  ...
}

这里有更多关于模板的信息:https://isocpp.org/wiki/faq/templates

 类似资料:
  • 我试图了解更多关于异步/等待的信息,尤其是编译器如何知道在异步方法和等待时“暂停”,而不产生额外的线程。 例如,假设我有一个异步方法,如 我知道是我的方法被“挂起”并且调用它的线程返回线程池的地方,一旦跟踪连接打开的完成,然后找到一个可用的线程来运行。 这就是我困惑的地方。我查看了OpenAsync的源代码(https://referencesource.microsoft.com/#System

  • 本文向大家介绍W3C DOM支持哪些方法?,包括了W3C DOM支持哪些方法?的使用技巧和注意事项,需要的朋友参考一下 以下是W3C DOM支持的方法- 序号 属性和说明 1 createAttribute(name) 返回具有指定名称的新创建的Attr节点。 例如-document.createAttribute(name) 2 createComment(text) 创建并返回一个包含指定文本

  • 我想在Mac终端中编译C11源代码,但失败了。我尝试了、、和 ,但都没有成功。终端始终读取 。然而, 和类似的东西运行良好(当然,C11源代码无法通过)。 我应该使用哪个选项来打开C 11支持? 顺便说一下,我正在使用的命令行工具安装在Xcode中,我很确定它们是最新的。

  • 我在Unity中有项目,使用Mapbox, Mapbox包含以下支持库:support-v4-25.1.0.aar 此库以.aar文件的形式提供,而不是作为gradle命令 尝试构建项目时,我收到此错误: 无法确定任务的依赖项:启动程序:lintVitalRelease。< br >无法解析配置的所有项目:launcher:debuguntimeclass path。< br >无法转换支持-v4

  • 问题内容: 是的,我知道FAQ会假装回答此问题,但实际上并非如此。相反,它指示您从源代码构建项目(并且构建说明非常复杂)。那种打败了整个观点:) 让我们省去世界上每个人的麻烦,即不必再构建另一个开源项目,以了解它是否真正解决了他们的问题。Xuggler支持哪些编解码器? 问题答案: FAQ不能回答这个问题的原因是,随着我们发布新版本,它会不断变化,并且要使文档中的列表保持最新状态会花费很长时间。但

  • 这里的My作为My EntityManager仍然连接到实际在persistence.xml中指定的JTA数据源。 因此,我开始考虑通过非注入的方式创建EntityManagerFactory(比如使用,但在这里,不管persistence.xml或我的属性映射怎么说,我都得到了一个EntityManagerFactory! 如何获得启用JTA并与编译时未知的任意数据源名称关联的EntityMan