为什么我可以使用从模板功能
我有模板类MyClass的为什么我可以使用从模板功能
template <class T>
class MyClass
{
public:
MyClass() { }
private:
void PrivateFunction() {
std::cout << "Message From Private Function" << std::endl;
}
};
现在,当我试图使用PrivateFunction()内的另一个功能,编译器会报告错误,但是当我试图同里面的模板私有方法函数编译器不显示任何错误。
-
编译器不报告错误。
template <class T> void f() { MyClass<int> a; a.PrivateFunction(); }
-
编译器报告错误。
void f() { MyClass<int> a; a.PrivateFunction(); }
为什么我可以使用从模板函数的私有方法?
你不能。 §14.6[temp.res]/p4:
如果没有为模板生成有效的特化,并且该模板未实例化,则模板不合格,不需要诊断。
我很感兴趣,为什么我不能调用该函数
编译器,直到函数模板实例可推迟分析之前看到的错误。不过,这是一个实现定义的行为,你的代码保持形成不良(在§14.6/ P4的延续):
[注:如果一个模板实例,错误将被诊断根据本标准的其他规则。 确切地说,当这些错误被诊断出来是一个实施质量问题。 - 注完]
GCC demo(仅问题实例上的错误)
Clang demo(发出错误没有实例化)
感谢Piotr,现在很清楚。 – 2014-09-13 10:46:43
这不是很准确。该模板不合格,不需要诊断,因此如果需要,编译器可以自由诊断。不管它是否是实现问题的质量,并且至少有一个编译器(Clang)不需要实例化'f()'就可以诊断错误。 – 2014-09-13 11:32:27
@ T.C .:谢谢,更新 – 2014-09-13 11:43:07
你打电话模板函数'F()'了吗? – billz 2014-09-13 10:41:14
是的只有在这种情况下,我得到的错误,但我有兴趣为什么我不能在调用函数之前看到错误。 – 2014-09-13 10:42:23
您是否得到错误取决于编译器。即使“f”从未实例化,clang也会显示1和2的错误。 – hvd 2014-09-13 10:58:28