Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法模板化虚拟函数。只是暂时的技术限制?_C++_Templates - Fatal编程技术网

C++ 无法模板化虚拟函数。只是暂时的技术限制?

C++ 无法模板化虚拟函数。只是暂时的技术限制?,c++,templates,C++,Templates,我知道不能将虚拟方法声明为模板,因为编译器不知道在虚拟表中保留多少条目。然而,这是一种技术限制,而不是语言限制。编译器可以知道实际需要多少模板实例,并“返回”以分配适当的vtable大小 在即将发布的标准中是否有计划的技术解决方案?编译器永远不可能知道模板的所有可能实例化。在当前的编译模式下,每个翻译单元都是单独编译的,然后链接起来。在一个翻译单元中编译模板类型时,您不知道该类型在另一个翻译单元中的实例化 假设您正在编写一个库,并且希望其中包含一个模板函数。编译库,然后将其分发给客户。现在,客户

我知道不能将虚拟方法声明为模板,因为编译器不知道在虚拟表中保留多少条目。然而,这是一种技术限制,而不是语言限制。编译器可以知道实际需要多少模板实例,并“返回”以分配适当的vtable大小


在即将发布的标准中是否有计划的技术解决方案?

编译器永远不可能知道模板的所有可能实例化。在当前的编译模式下,每个翻译单元都是单独编译的,然后链接起来。在一个翻译单元中编译模板类型时,您不知道该类型在另一个翻译单元中的实例化

假设您正在编写一个库,并且希望其中包含一个模板函数。编译库,然后将其分发给客户。现在,客户机可以用他们喜欢的任何模板参数实例化模板函数,但是您的库已经编译好了!它不能“回去”改变这个


假设在编译模板函数时,该函数的每个实例化都可用。通常情况并非如此,而且在当前的编译和链接模型下,无法确定情况是否如此。

考虑到不需要使用现有链接器,这样做肯定是有可能的。也就是说,链接器可以筛选该模板函数的所有实例化,并构建适当的数据结构。但是C++的一个优点是不需要专门的链接器;这使得它可以移植到链接器是用石头写的并且不能更改的系统中。是的,这种情况确实发生了;链接器是目标代码遇到的all的地方,它必须与系统支持的all编程语言兼容,这反过来意味着它有时会变得陈旧和粗糙,任何更改都会带来很大的破坏风险。因此,虽然理论上是可行的,但它不会发生。

< P> >目前没有什么基于C++标准委员会的计划。C++标准指定C++实现的要求,但不定义技术实现本身。因此,模板虚拟函数显然不是技术限制,而是标准定义的语言限制。尽管如此,语言的局限性可能是由于更改现有实现所涉及的风险,而不是由于实现的技术局限性而造成的。

这的确是事实,但它们不能用动态vtable解决吗?但我确实理解这需要多大程度的混乱;原则上,虚拟元数据可以在该点生成,而不是在定义基类时生成。因此,这不是一个不可逾越的障碍,只是一个需要对该语言当前定义的编译/链接模型进行根本性更改的障碍(如果您想支持动态链接,还需要进行更多更改)。@StefanoBorini当然,这是可以解决的。没有什么是不可能的!它将需要对C++程序进行编译和链接的方式进行一些相当大的改变,这也需要在标准中反映。它还需要以一种或那种形式嵌入源。就像出口一样。导出已被删除。@MikeSeymour什么是完整程序?关于DLPEN()和其他动态加载设施的思考。请举例说明你希望完成的(如果编译器的限制可以忽略)。也许一个更深刻的方法是问一个必须跳过的箍,以在当前的C++中实现类似的机制,然后如何自动化该过程。毕竟,任何想要的最终数据结构都已经在语言的表达能力之内。唯一的问题是,
template virtual
不是达到目的的方法。@Roee:没什么特别的,只是想了解环境。@RoeeGavirel“你能举个例子说明你希望实现什么吗”-嗯……也许……使用虚拟方法模板?