C++编译错误及解决办法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

编译错误一:XX does not name a type 
编译错误二:field `XX' has incomplete type 

编译错误一:
XX does not name a type, 中文意思为“XX没有命名一个类型“
拿个例子来讲,如果两个类定义如下:
class B{
public:
B(){}
~B(){}

private:
A a;
};

class A{
public:
A(){}
~A(){}

private:
int a;
};

编译成则将报一个error:"A does not name a type"
报错的位置为红色那一行。

即使clase A和class B分别在两个文件定义,并且在定义B的文件头中#include了class A的头文件也同样会报这个错(这是因为编译和链接之间的先后关系造成的)。

解决该错误的办法:
在class B定义声明之前先声明一下class A, 如下:
class A;
class B{
public:
B(){}
~B(){}

private:
A a;
};

class A{
public:
A(){}
~A(){}

private:
int a;
};

参照: http://www.allegro.cc/forums/thread/586909

编译错误二:field `XX' has incomplete type
同样紧跟上面的例子,通过问题一的办法,第一个错误已经消失,但是马上第二个错误就出现了!还是同一个位置。
这个错误的意思,就是说class B中的XX域的类型不够完整,为什么呢?明明class A后面已经定义好了啊。其实原因还是和前面一样,在class B定义之前,我们也只是对class A进行了声明而并没有进行具体的定义,所以解决该错误的方法是:
将class B定义中的A域改用指针就行了。改正后代码为:
class A;
class B{
public:
B(){}
~B(){}

private:
A *a;
};

class A{
public:
A(){}
~A(){}

private:
int a;
};

这样,这段简单的代码才能没有错误的通过编译。

*********************************************************

[3]编译错误

You can get the error

  cannot declare member function ‘static int Foo::bar()’ to have static linkage

if you declare a method to be static in your .cc file.

The reason is that static means something different inside .cc files than in class declarations It is really stupid, but the keyword static has three different meanings. In the .cc file, the static keyword means that the function isn't visible to any code outside of that particular file.

This means that you shouldn't use static in a .cc file to define one-per-class methods and variables. Fortunately, you don't need it. In C++, you are not allowed to have static variables or static methods with the same name(s) as instance variables or instance methods. Therefore if you declare a variable or method as static in the class declaration, you don't need the static keyword in the definition. The compiler still knows that the variable/method is part of the class and not the instance.

WRONG

 Foo.h:
 class Foo 
 {
   public: 
     static int bar();
 };
 Foo.cc:
 static int Foo::bar() 
 {
   // stuff
 }

WORKS

 Foo.h:
 class Foo 
 {
   public: 
     static int bar();
 };
 Foo.cc:
 int Foo::bar() 
 {
   // stuff
 }

A way to bypass this problem is to embed the defintion in the .h file, but this causes the function to be inline by default.


C++——编译报重复定义错误解决办法 头文件被多次编译 阅读详情

相关推荐

vc++配置问题

参考 http://zhidao.baidu.com/question/13693395.html 可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “Compiling... ,Error spawning cl.exe”错误提示给郁闷过。很多人的 选择是重装,实际上这个问题很多情况下是由于路径设置的问题引起的, “CL.exe”是VC使用真正的...

lshf171028的博客 295

在cmd命令行下使用VS Build Tools 编译运行C/C++源文件

Introduction The following tools can help you to build a C/C++ project on the command line[10]. CL Use the compiler (cl.exe) to compile and link source code files into apps, libraries, and DLLs. Lin...

cocoonyang的专栏 1万+

C语言编译出现一个警告,16种C语言编译警告(Warning)类型的解决方法

编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误,也可能确实没有问题。对于警告的正确处理方式应该是:尽可能地消除之。对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题。只有那些确实无问题的警告才能放下不管。说明:由于编译的警告各种各样,根本不可以一一罗列出来,下面只是列举出比较典型的一些警告,还有一些警告,大家只要根据字面意思,就...

weixin_42534100的博客 9780

Error: failed to find a main class in

运行eclpse时出项上面问题,在目录下找不到主类。 错误原因: 安装目录下不能出现中文!(详细原因不清楚,期待大神解决) 解决方法: 直接剪切整个文件,放在没有中文的目录下,搞定!

求知若渴!大智若愚! 2万+

android.mk 编译32位_C/C++初学者常见编译错误及其解决办法

用户在C/C++集成开发环境(例如 Dev-C++)中编辑了源代码,执行编译之后,常常会因为源代码中存在问题而出现编译错误(它们会显示在编译窗口中)。初学者常常会面对这些错误而不知如何处理。本文下面列出几个初学者常见的错误及其解决办法错误信息通常是用英语显示的,在 Dev-C++ 中如果启用了“出错信息翻译为中文”选项,则能够把常见出错信息翻译为中文,这给初学者带来了一些方便。无论是显示为英文或...

weixin_35953704的博客 1283

【转】 C++常见编译/链接错误及其解决办法

1. 解决error LNK2005: ___crtExitProcess 已经在 LIBCMTD.lib(crt0dat.obj) 中定义 有的時候, 在 Debug 模式下編譯沒問題, 換到 Release 模式就發生一堆問題. 典型的例子, 就是因為 c++ runtime library 設定不同, 所造成的重複定義連結錯誤. 而另一個常見的例子是 專案與 library 使用不同的...

weixin_30729609的博客 141

面试:类模版中函数声明在.h,定义在.cpp中,其他cpp引用引入这个头文件,会有什么错误?

编译编译一个源文件时,会根据文件中函数的调用去查找函数声明,如果找到了匹配的声明,编译器就认为这个函数存在,并生成一个对外部符号的引用。

GHL284271090的博客 613

C++常见编译/链接错误及其解决办法

ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。5.errorC2662"MyClassGetName()”不能将“this”指针从“constMyClass”转换为“MyClass&”原因是不能在const函数中调用对象的非const方法,MyClass中的GetName()必须是const的。...

unber的博客 2169

VS编译C++常见错误解决办法

对于初学者而言,使用Visual Studio (VS) 编译C++程序时遇到的错误往往令人困惑。这些错误主要源于对IDE操作、项目配置和C++语言特性不熟悉。以下将初学者高频错误系统归类,并提供详细的诊断步骤和解决方案,辅以具体代码示例。这类错误发生在第一步,通常是因为没有正确建立或配置一个“可编译”的C++项目。初学者代码中的常见语法问题,会被VS编译器捕获并报错。

weixin_75200704的博客 304

C++17的directory_iterator编译错误解决办法

源代码如下: #include <iostream> #include <filesystem> using namespace std; using namespace std::filesystem; int main(int argc, char **argv) { path str("/"); if (!exists(str)) { return -1; } director

canlynetsky的博客 3433

编译错误:EasyX is only for C++

错误描述: 在 Visual C++编译引用 graphics.h 头文件后,编译产生错误: fatal error C1189: #error : EasyX is only for C++ 错误原因: 为了降低学习编程的干扰,EasyX 库在很大程度上简化了图形函数的使用。由于在简化图形函数的过程中使用了部分 c++ 的特性,因此,当代码是 .c 扩展名时,Visual C++ 会调用 c 编译器而不是 c++ 编译器,以至于产生这个编译错误。 解决方案: 不用修改任何程序代码.

enter回车键 8404

OpenGL配置GLAD后编译错误:预编译头文件来自编译器的早期版本

OpenGL配置GLAD后编译错误:预编译头文件来自编译器的早期版本 出错原因: 用C++控制台程序建立 .cpp 项目且添加了glad.c文件后,项目中混合了 .cpp 和 .c 文件,由于编译器对它们采取不同的编译方式因此出错。因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp)。 解决办法: 项目——属性——C/C++——预编译头——预编译头——不使用预编译头文件 ...

LEO_LP的博客 1219

C++常见移动语义编译错误解决办法

本文分析了C++11中常见的移动语义编译错误,重点针对包含不可移动类型(如std::condition_variable)的类无法使用移动赋值的问题。核心错误是尝试用临时对象赋值时移动运算符被自动删除。根本原因是类中存在不可移动成员(如condition_variable),导致编译器禁止移动操作。 文章提出了三种解决方案: 最优方案是添加reset()方法直接重置对象状态,无需创建临时对象; 次优方案是显式声明移动运算符(但对含condition_variable的类无效);

葱卤山猪的博客 329

linux c c++ 编译时的错误程序中有游离的‘\240“\302解决办法

c编译时的错误程序中有游离的‘\240“\302解决办法 sed -i ‘s/\o240|\o302//g’ xxx.cpp

qq_42946963的博客 6254

关于 duplicate symbol 编译错误

尽量使 .h 文件只声明,定义写到 .cpp 里, 如果定义也写在 .h 内, 要添加 inline 关键字. 否则, 当此 .h 文件被其它文件包含时, 就会出现 duplicate symbol 编译错误.

wdstudio的博客 2088

vs2008 error C2143: 语法错误 : 缺少“{”(在“:”的前面)

最近写程序遇到如下问题:编译编译器提示一堆如下错误:c:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/cerrno(18): error C2143: 语法错误 : 缺少“{”(在“:”的前面)找了很长时间,最终的原因是:在我的源文件中使用了C++的库函数,但是我却将这个源文件的后缀名写成.c而不是.cpp,将其

zhong871004的专栏 3917

C++编译时引起Lnk2005错误的几种情况与解决办法

(1)重复定义全局变量。解决办法,在单个cpp文件中定义变量如 int g_iCounter,其它位置使用此变量时,用extern关键字进行修饰,如extern int g_iCounter。 (2)头文件重复包含。解决办法,在头文件中加入相应宏:   #ifndef MY_H_FILE       //如果没有定义这个宏    #define MY_H_FILE       //定义这个

Zr‘s code world 4844
上一篇: linux中进程管理
下一篇: Sigslot库
_小青年儿_
博客等级 码龄16年 155粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值