文章目录
- VS2019 - error C2653: 不是类或命名空间名称
- 概述
- 笔记
- 类的头文件
- 类的实现文件
- 备注
- END
VS2019 - error C2653: 不是类或命名空间名称
概述
工程开了预编译头包含.
编码中, 随手写一个类, 将功能函数加入, 还没开始用这个类, 先习惯性的编译一下.
编译报错如下:
StringOpt.cpp(12,13): error C2653: “CMyStringOpt”: 不是类或命名空间名称
单独将这个类(.h, .cpp)包含进我的一个正常的工程模板(vs2019 c++ console), 没问题…
笔记
查资料, 出现这种问题, 主要是头文件包含和前向声明的问题. 每个人的情况不一样.
尝试调整头文件包含和类前向声明, 然后尝试编译.
发现是预编译头文件的包含位置的问题.
pch.h 在.cpp中, 包含在类头文件之前就正常, 如果包含在类头文件之后, 就编译报错 C2653.
类的头文件
//! \file StringOpt.h#ifndef __STRINGOPT_H__
#define __STRINGOPT_H__#include <string>class CMyStringOpt
{
public:CMyStringOpt() {}virtual ~CMyStringOpt() {}std::string my_W2A(std::wstring strW);std::wstring my_A2W(std::string str);std::wstring UTF8ToUnicode(const std::string& str);std::string UnicodeToUTF8(const std::wstring& wstr);
};#endif // #ifndef __STRINGOPT_H__
类的实现文件
//! \file StringOpt.cpp#include "pch.h" // build ok
#include "StringOpt.h"
// #include "pch.h" // build err => StringOpt.cpp(13,13): error C2653: “CMyStringOpt”: 不是类或命名空间名称#include <atlconv.h>
#include <locale> // std::wstring_convert
#include <codecvt> // for std::codecvt_utf8// 编译器指示, 下面这行报错. StringOpt.cpp(11,13): error C2653: “CMyStringOpt”: 不是类或命名空间名称
std::string CMyStringOpt::my_W2A(std::wstring strW)
{// ...
备注
在C++工程中, 头文件包含还是要注意, 否则有可能编译报错.
如果工程写大了, 出现编译问题真是浪费时间. 有的时候不好查, 得版本回退来验证编译问题.
尽量使头文件包含简单一些, 使类之间互相引用的情况少一些.
公共头文件(e.g. pch.h)中, 只包含系统头文件.
在自己的类.h中, 只包含非常必要的头文件(保证编译不报错就行), 如果类成员函数声明中的入参或类成员变量中用到了其他类(或类指针), 如果可以用类的前向声明编译过, 就不要包含所需要的类的头文件.
在自己的类.cpp中, 可以随便包含头文件.
如果是公共头文件要包含, 要放在类头文件包含之前优先包含.