为什么我可以使用模板函数中的私有方法
Why I can use private methods from template functions
我有模板类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[温度res]/p4:
如果不能为模板生成有效的专门化,并且该模板没有实例化,则该模板格式错误,不需要诊断。
我很感兴趣为什么在调用函数之前看不到错误
编译器可以推迟分析,直到函数模板被实例化。尽管如此,这是一种实现定义的行为,您的代码仍然是格式错误的(§14.6/p4的延续):
[注意:如果模板被实例化,将根据本标准中的其他规则诊断错误。诊断这些错误的确切时间是实施质量问题。--结束注意]
GCC演示(仅在实例化时发出错误)
Clang demo(在没有实例化的情况下发出错误)
相关文章:
- C++中是否有任何函数等同于python中字典的get函数?
- 有没有函数可以在擦除 c++ 中获取 deque.begin() 的 int 值?
- 是否有pass函数作为模板参数
- 有没有函数可以直接获取 std::vector 元素的大小?
- 是否有一个C++函数可以准确返回平方根反比的内置 CPU 操作 RSQRTSS 的值?
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 我有一个C++函数,它在Dev C++中编译,但在G++中不编译
- C++ - 类方法函数指针unordered_map的初始化器列表
- 是否有任何 C 函数或 API 来获取当前登录用户下运行的进程列表
- 我可以在函数中有一个函数吗?
- 如何从具有多个对象/字段的类中调用方法函数
- C++ std::string 中是否有任何函数可以计算两个字符串的相同起始字符的总数或任何最佳方法
- 是否有一个函数可以显示我创建的类中的对象到 QTextBrowser 中?
- C - 如何编写一个函数,返回真实有价值函数的导数,而不是导数的值
- 在 GetProcAddress 的 lpProcName 中是否有 DLL 函数修饰的参考
- 在调用main函数之前,是否有方法解析命令行选项?
- 我可以有一个函数/方法通过引用传递参数和重载通过值传递它在c++中
- 是否有方法检测内联函数ODR违规
- Resharper C++中是否有将函数/方法转换为尾部返回类型的选项
- 是否有方法在调用函数时防止隐式的static_cast ?