为什么我可以使用模板函数中的私有方法

Why I can use private methods from template functions

本文关键字:有方法 函数 我可以 可以使 为什么      更新时间:2023-10-16

我有模板类MyClass

template <class T>
class MyClass
{
public:
  MyClass() { }
private:
  void PrivateFunction() { 
    std::cout << "Message From Private Function" << std::endl; 
  }
};

现在,当我尝试在另一个函数编译器中使用PrivateFunction()时,会报告错误,但当我尝试相同的内部模板函数编译器时,不会显示任何错误。

  1. 编译器未报告错误。

    template <class T>
    void f()
    {
      MyClass<int> a;
      a.PrivateFunction();
    }
    
  2. 编译器报告错误。

    void f()
    {
      MyClass<int> a;
      a.PrivateFunction();
    }
    

为什么我可以使用模板函数中的私有方法

你不能。§14.6[温度res]/p4:

如果不能为模板生成有效的专门化,并且该模板没有实例化,则该模板格式错误,不需要诊断。


我很感兴趣为什么在调用函数之前看不到错误

编译器可以推迟分析,直到函数模板被实例化。尽管如此,这是一种实现定义的行为,您的代码仍然是格式错误的(§14.6/p4的延续):

[注意:如果模板被实例化,将根据本标准中的其他规则诊断错误。诊断这些错误的确切时间是实施质量问题。--结束注意]

GCC演示(仅在实例化时发出错误)
Clang demo(在没有实例化的情况下发出错误)