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

时间:2014-09-13 10:39:14

标签: c++ function class templates

我有模板类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();
    }
    

1 个答案:

答案 0 :(得分:13)

  

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

你做不到。 §14.6[temp.res] / p4:

  

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


  

我感兴趣的是为什么在调用函数

之前我无法看到错误

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

  

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

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