Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译器会忽略模板类中的结构元素?_C++_Templates_Compiler Construction_Struct - Fatal编程技术网

C++ 为什么编译器会忽略模板类中的结构元素?

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

我正在使用g++编译器。我编写了以下代码,其中包含一个模板类定义。该类有一个名为node的结构数据类型,其中包含泛型类型的元素a和b。该类有一个名为print的函数,它打印p.h,其中p是类对象的node类型的变量。虽然“h”不是struct node的元素,但编译器不会显示任何错误。为什么呢

    #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>没有什么好处,而且在查看该类时也会抛出不必要的东西。.