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

标签 c++ templates compiler-construction struct

我正在使用 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/

相关文章:

java - 我自己的Java编译器和字节码: Problems invoking functions

运行时语言更改的解析技术

c++ - Windows Messaging - 捕获来自另一个 API 的调用

c++ - 将 Qt GUI 添加到动态库

c++ - 检查一组类型是否是另一组类型的子集

c++ - 交叉编译器库交互(动态加载)(插件)

c++ - MSVC2013 和 MingW 之间的差异导致最令人烦恼的解析问题

c++ - 我应该在 cpp 中使用 std::map 之前调用 clear

具有继承的 C++ 模板特化

c++ - 使用另一个类的模板参数实例化一个模板类