C++bug笔记(1)

1.头停止点不在文件范围内。未生成 IntelliSense PCH 文件

网上解决方案:

以#pragma once作为头文件的第一句就可以避免出现文章标题所说的警告问题,

实际上#pragma once 与#ifndef 块作用是一样的,都是为了防止同一个文件被#include多次,只是机理有些不同.对于这两种方法,单独使用其中任何一种就可以,在编译上不会有什么问题.在这里同时使用这两种方法主要是为了解决文章标题所提的问题而已.

个人解决方案:

删除这个头文件,复制其中内容,重新新建头文件,粘贴下去,就没报错了

2. error : '<end Parse>'

个人解决方案:

删除这个头文件,复制其中内容,重新新建头文件,粘贴下去,就没报错了

3.模板类成员函数返回值是类内结构体时,定义时前面需显式地声明

template <typename T>

typename 类名<T>::+返回值+ 类名<T>::+函数名+参数表

4.模板类重载类的结构体输出运算符后

error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits

解决:在重载定义前加template <typename T>

5.C++语言 error C3867:非标准语法;请使用 "&" 来创建指向成员的指针

情况:https://bbs.csdn.net/topics/391998236?page=1

6.模板类定义与声明分开成.h和.cpp,出现无法识别符号的奇怪bug,

解决方案:模板类定义与声明应该放于同一个头文件,内将cpp内容的拷贝至.h放在声明下面,或者你偏要不这样做的话,可以查一下,记得找到过其他方法

7.在子类成员函数中使用模板类父类的成员变量没有在前面加this->,导致变量出现未声明的错误

根本原因是因为模板的二次编译机制导致的,在第一阶段只对模板中和模板参数无关的名字进行查找(无视那些有模板参数的部分)。父类是模板类,在第一次编译的时候会被无视掉,所以此时无法找到模板类父类的成员变量,编译器报错。这时只需在变量前面加父类名::或this->,就可以将此操作等待到第二次编译阶段,在第二阶段编译器主要处理带模板参数的部分,所有和模板相关的操作都在该阶段完成。

猜你喜欢

转载自blog.csdn.net/weixin_42622658/article/details/89743003