C++ 为什么编译器会忽略模板类中的结构元素?
我正在使用g++编译器。我编写了以下代码,其中包含一个模板类定义。该类有一个名为node的结构数据类型,其中包含泛型类型的元素a和b。该类有一个名为print的函数,它打印p.h,其中p是类对象的node类型的变量。虽然“h”不是struct node的元素,但编译器不会显示任何错误。为什么呢C++ 为什么编译器会忽略模板类中的结构元素?,c++,templates,compiler-construction,struct,C++,Templates,Compiler Construction,Struct,我正在使用g++编译器。我编写了以下代码,其中包含一个模板类定义。该类有一个名为node的结构数据类型,其中包含泛型类型的元素a和b。该类有一个名为print的函数,它打印p.h,其中p是类对象的node类型的变量。虽然“h”不是struct node的元素,但编译器不会显示任何错误。为什么呢 #include<iostream> #include<cstdlib> using namespace std; template <t
#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);
}
#包括
#包括
使用名称空间std;
模板
mc类
{
类型定义结构节点
{
e a,b;
}节点;
节点p;
公众:
作废打印();
};
模板
void mc::print()
{
std::cout如果您不使用模板的对象(实例),编译器只检查模板的逻辑。模板不会被实例化。但是如果您尝试使用模板的实例,该模板将被实例化(扩展),那么您将看到h
不是p
的成员的错误
也就是说,如果您注释掉//m.print()
,模板将被实例化。为了使编写模板
类更容易一些,未调用的模板
方法不会被实例化
检查了一些东西——方法的签名,它查找只涉及不依赖于类的模板参数等数据的任何方法或函数
在这种情况下,p
在技术上依赖于类的模板
参数,因此在实例化时检查p.h
是否有效。现在,您可以证明不存在e
,这样p.h
是有效的,但编译器不必这样做,因此不需要麻烦
程序可能仍然格式不正确:标准中有条款规定,如果模板没有有效的专门化,程序可能格式不正确(无需诊断),但我不知道这是否适用于模板的方法
一旦调用print
,就会实例化该方法,并注意到错误
在std
库中使用它的一个例子是vector
——它的许多方法,包括,必须使用模板才能实例化(和编译)在 P<代码>中,我没有看到<<代码> h <代码>。为什么<>代码>节点< /C> >是代码> TyPulf< <代码> ED,但是 Mc<代码>不是吗?至少在C++中对 TyPulf</C>没有什么好处,而且在查看该类时也会抛出不必要的东西。.