【问题标题】:Why is a class template instantiated when it's ot required to be a completely object type?为什么类模板不需要完全是对象类型时要实例化?
【发布时间】:2015-02-21 08:09:30
【问题描述】:

类模板可以显式或隐式实例化,如果N3797::14.7.1/1 [temp.inst],则类模板被隐式实例化

除非一个类模板特化已经明确 实例化(14.7.2)或显式特化(14.7.3),类 模板特化是隐式实例化的,当 专业化是在需要的上下文中引用的 完全定义对象类型或当类的完整性 类型会影响程序的语义。

让我提供一个示例,当上下文不需要完全定义类类型时:

#include <iostream>

template<class T>
struct A
{
    void foo();
};

template<class T> void A<T>::foo(){ std::cout << "foo" << std::endl; }

A<int>* a;
int main(){ a -> foo(); }

DEMO

在那个例子中,类模板既没有显式也没有隐式实例化。所以,我们实际上没有A&lt;int&gt; 类的定义。但尽管它工作正常。你不能解释一下这种行为吗?

【问题讨论】:

  • 你正在调用A&lt;int&gt;::foo(),所以你需要一个完整的类型。引用不是说在这种情况下模板是隐式实例化的吗?
  • 我怀疑调用该函数将需要一个正确类型的 this 指针和一个可寻址的函数指针(也是完全类型的)。​​

标签: c++ templates


【解决方案1】:

[expr.ref]/p2,强调我的:

对于第二个选项(箭头),第一个表达式应该有指针 完成类类型。

为什么你认为它是一个不需要完全定义对象类型的上下文?

【讨论】:

  • 确实,我的错。我想要实现的是构建一个示例,如果模板未显式实例化,则会导致编译器/链接器错误。有没有可能
  • @DmitryFucintv 不在一个有效的程序中,除非它是一个编译器错误,而且它也可能需要多个翻译单元; [temp]/p6 可能有用。
  • 据我了解,我们不需要显式实例化模板,因为如果我们开始在需要完全定义的对象类型的上下文中使用它,模板将被隐式实例化并且因此我们将把它用作一个完整定义的类或函数。
  • @DmitryFucintv 通常将实现与接口分离(或通过显式实例化声明节省编译时间)。
  • 这不清楚编译器不知道在另一个翻译单元中完成的显式实例化这一事实。如果我们将显式实例化放在另一个TU中,而模板出现在上下文中需要模板实例化,会不会被隐式实例化?
【解决方案2】:

参见14.7.1/4 的示例,该示例表明a -&gt; foo(); 是“需要完全定义的对象类型的上下文”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多