Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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_Class Template - Fatal编程技术网

C++ 模板化类的成员函数何时实例化?

C++ 模板化类的成员函数何时实例化?,c++,templates,class-template,C++,Templates,Class Template,考虑以下示例: template<typename T> class Base { public: inline void fooBase () { T t; // The following error only occurs when class ABC is not defined at the end of the file: "error: t uses undefined class ABC" } protected: }; class ABC; c

考虑以下示例:

template<typename T>
class Base
{
public:
  inline void fooBase ()
  {
    T t; // The following error only occurs when class ABC is not defined at the end of the file: "error: t uses undefined class ABC"
  }
protected:
};

class ABC;
class DEF;

class Derived : public Base<ABC>
{
public:
  void fooDerived ()
  {
    DEF def; // error: def uses undefined class DEF
  }
};

Derived derived;
void foo ()
{
  derived.fooBase ();
}

class ABC {};
class DEF {};
模板
阶级基础
{
公众:
内嵌void fooBase()
{
T;//只有在文件末尾未定义类ABC时,才会发生以下错误:“错误:T使用未定义的类ABC”
}
受保护的:
};
ABC类;
DEF类;
派生类:公共基

模板化类的成员函数何时实例化

类模板专门化的成员函数的声明与类专门化一起实例化,但定义仅在需要时实例化。通常在调用成员函数时。只要没有任何东西使用成员函数,该定义就可以取消实例化

您的示例调用成员函数,因此必须实例化定义

然而,专业化的成员函数可能有多个实例化点。一个在使用之前,但另一个(总是添加的)在翻译单元的末尾

[temp.point](强调矿山)

函数模板、成员函数的专门化 模板,或类的成员函数或静态数据成员的 模板在一个模板中可能有多个实例化点 翻译单元,除了实例化点 如上文所述,对于任何具有 翻译单元内的实例化,翻译的结束 单元也被视为实例化点。专门从事 一个类模板在一个类中最多有一个实例化点 翻译股。任何模板的专门化都可能有以下要点: 在多个翻译单元中实例化如果两个不同的点 实例化的定义赋予模板专门化不同的含义 根据“一个定义”规则,程序的格式不正确,不是吗 需要诊断。


这就引出了下一点,
fooBase
在您展示的翻译单元中有两个实例化点。在一个
中,ABC
不完整,而在另一个中,它已完成。根据上述段落,您的程序格式不正确,不需要诊断。编译器可以对违规行为保持沉默,同时发出一些似乎有效的代码。但这并不意味着该计划有效。如果在这种情况下,标准在将来更新为需要诊断,则非法代码将无法生成。如果编译器希望对其进行诊断,它现在甚至可能会失败。

如果我理解正确,那么在类
ABC
之后定义
foo()
时,即在文件末尾?@m7913d-您理解正确,是的。如果在
foo
之前完成了
ABC
,程序将是格式良好的。那么,(最后一个代码块)中的代码也是格式不正确的?@m7913d-乍一看就可以了。编写智能指针类型通常是为了正确处理不完整的类型。键用于在定义任何需要完整类型的成员函数之前完成类型。在你展示的片段中,我认为没有问题。
wek_ptr
通常根本不需要完整的对象类型,在完成之前,短代码段中没有任何其他内容被实例化或使用
User
。好的,谢谢。这很棘手,因为编译器不必包含错误消息。