我正在使用 g++ 编译器。我写了下面的代码,它有一个模板类定义。该类有一个名为 node 的结构数据类型,它具有通用类型的元素 a 和 b。该类有一个名为 print 的函数,它打印 p.h,其中 p 是类对象的类型节点变量。尽管“h”不是结构节点的元素,但编译器不会显示任何错误。这是为什么?
#include<iostream>
#include<cstdlib>
using namespace std;
template <typename e>
class mc
{
typedef struct node
{
e a,b;
}node;
node p;
public:
void print();
};
template <typename e>
void mc<e>::print()
{
std::cout<<p.h;
}
int main()
{
mc<int> m;
//m.print();
return(0);
}
只有当 m.print() 在 main 中取消注释时,编译器才会显示错误。这是为什么?
最佳答案
如果不使用模板的对象(实例),编译器只检查模板的逻辑。模板不会被实例化。但是,如果您尝试使用模板的实例,该模板将被实例化(扩展),然后您将看到 h
不是 p
的成员的错误。
也就是说,如果注释掉//m.print()
,模板就会被实例化。
关于c++ - 为什么编译器会忽略模板类中的结构元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24038919/