我有模板类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();
}
答案 0 :(得分:13)
为什么我可以使用模板函数中的私有方法?
你做不到。 §14.6[temp.res] / p4:
如果无法为模板生成有效的专业化,并且未实例化该模板,则模板格式错误,无需诊断。
我感兴趣的是为什么在调用函数
之前我无法看到错误
编译器可以推迟分析,直到实例化函数模板。尽管如此,这是一个实现定义的行为,并且您的代码仍然格式错误(§14.6/ p4的延续):
[注意:如果实例化模板,将根据本标准中的其他规则诊断错误。 确切地诊断出这些错误是一个实施质量问题。 - 结束记录]
GCC demo(仅在实例化时发出错误)
Clang demo(在没有实例化的情况下发出错误)