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

C++ 为什么我可以使用模板函数中的私有方法,c++,function,class,templates,C++,Function,Class,Templates,我有模板类MyClass template <class T> class MyClass { public: MyClass() { } private: void PrivateFunction() { std::cout << "Message From Private Function" << std::endl; } }; 模板 类MyClass { 公众: MyClass(){} 私人: void PrivateFunct

我有模板类MyClass

template <class T>
class MyClass
{
public:
  MyClass() { }
private:
  void PrivateFunction() { 
    std::cout << "Message From Private Function" << std::endl; 
  }
};
模板
类MyClass
{
公众:
MyClass(){}
私人:
void PrivateFunction(){
标准::cout
为什么我可以使用模板函数中的私有方法

你不能.§14.6[暂时恢复]/p4:

如果无法为模板生成有效的专门化,并且该模板未实例化,则该模板的格式不正确,不需要诊断


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

编译器可能会推迟分析,直到函数模板被实例化。不过,这是一种实现定义的行为,并且您的代码仍然格式不正确(续§14.6/p4):

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

(仅在实例化时发出错误)

(在没有实例化的情况下发出错误)

是否调用了模板函数
f()
还没有?只有在这种情况下,我才会得到错误,但我感兴趣的是,为什么在调用函数之前我看不到错误。是否得到错误取决于编译器。即使从未实例化
f
,clang也会显示1和2的错误。无法为模板
f()生成有效的实例化
在1中,因此模板格式不正确,不需要诊断。编译器是在模板定义时诊断错误,还是在实例化时诊断错误,这是一个实现质量问题。下面是一个很酷的视频系列,其中STL先生讲述了这些(以及许多其他)错误是如何发生的事情是这样的:。如果你正在开始你的职业生涯,值得一看!这不是很准确。模板格式不正确,不需要诊断,因此编译器可以自由地诊断它(如果愿意)。是否这样做是一个实现质量问题,并且至少有一个编译器(Clang)在不需要实例化
f()的情况下诊断错误
。学究式的做法在这里很有帮助:没有模板函数这样的东西。有一些函数模板可以用来生成函数。如果函数模板生成格式错误的函数,则特定函数会报告错误。判断函数模板是否只能生成格式错误的函数更加困难如果这是一个错误,这是有争议的。这种诊断是不需要的,因为很难指定哪些问题足够明显,不需要实例化就可以诊断。例如,
private
方法可以被朋友调用,这意味着你需要在没有实际实例化的情况下弄清楚Action模板实例化将是一个好朋友。
template <class T>
void f()
{
  MyClass<int> a;
  a.PrivateFunction();
}
void f()
{
  MyClass<int> a;
  a.PrivateFunction();
}