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

Ash*_*yan 4 c++ templates class function

我有模板类MyClass

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

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

  1. 编译器不报告错误.

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

    void f()
    {
      MyClass<int> a;
      a.PrivateFunction();
    }
    
    Run Code Online (Sandbox Code Playgroud)

Pio*_*cki 13

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

你不能.§14.6[temp.res]/p4:

如果无法为模板生成有效的专业化,并且未实例化该模板,则模板格式错误,无需诊断.


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

编译器可以推迟分析,直到实例化函数模板.尽管如此,这是一个实现定义的行为,您的代码仍然是不正确的(§14.6/ p4的延续):

[ 注意:如果实例化模板,将根据本标准中的其他规则诊断错误.确切地说,这些错误被诊断出来是一个实施质量问题.- 结束说明 ]

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