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
。好的,谢谢。这很棘手,因为编译器不必包含错误消息。