2014-09-13 41 views
4

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

你打电话模板函数'F()'了吗? – billz 2014-09-13 10:41:14

+0

是的只有在这种情况下,我得到的错误,但我有兴趣为什么我不能在调用函数之前看到错误。 – 2014-09-13 10:42:23

+1

您是否得到错误取决于编译器。即使“f”从未实例化,clang也会显示1和2的错误。 – hvd 2014-09-13 10:58:28

回答

13

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

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

如果没有为模板生成有效的特化,并且该模板未实例化,则模板不合格,不需要诊断。


我很感兴趣,为什么我不能调用该函数

编译器,直到函数模板实例可推迟分析之前看到的错误。不过,这是一个实现定义的行为,你的代码保持形成不良(在§14.6/ P4的延续):

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

GCC demo(仅问题实例上的错误)
Clang demo(发出错误没有实例化)

+0

感谢Piotr,现在很清楚。 – 2014-09-13 10:46:43

+1

这不是很准确。该模板不合格,不需要诊断,因此如果需要,编译器可以自由诊断。不管它是否是实现问题的质量,并且至少有一个编译器(Clang)不需要实例化'f()'就可以诊断错误。 – 2014-09-13 11:32:27

+0

@ T.C .:谢谢,更新 – 2014-09-13 11:43:07

相关问题