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

原创 2012年03月24日 17:07:14

编译错误一: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++学习笔记 模板 包含编译模式 分别编译模式

写过模板的朋友也许知道,一个模板程序,当编译器看到模板定义时并不立即产生代码,只有在我们用到模板,并对其实例化的时候,才会产生特定的实例。此时,编译器就要访问定义模板的源代码了。如果源代码不可访问,当...
  • imxiangzi
  • imxiangzi
  • 2015年07月14日 09:37
  • 763

C++头文件编译问题(很清晰,终于明白了)

一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的...
  • Edward_hua123
  • Edward_hua123
  • 2014年06月20日 07:15
  • 2707

ubuntu 使用gcc 编译 C++ 及 遇到到问题

g++ -c filename(当前路径.cpp文件) // 只编译,不链接,生成.o 文件 g++ filename(当前路径.cpp文件) // 既编译,同时链接,生成可执行...
  • qing101hua
  • qing101hua
  • 2016年11月08日 21:40
  • 544

Cygwin下用crosstool-ng 编译交叉工具链

转zi Cygwin下用crosstool-ng 编译交叉工具链 Cywin版本:1.7.7(CYGWIN_NT-5.1) Crosstool-ng版本:1.9.3 操作系统:Window...
  • lizhiqiang5846
  • lizhiqiang5846
  • 2014年06月08日 09:48
  • 2151

【C++所遇】vs2010无法打开预编译头文件

错误:fatal error C1083: 无法打开预编译头文件:“Debug/XXX.pch”: No such file or  directory   1....
  • u011905949
  • u011905949
  • 2014年07月10日 00:54
  • 2090

LTP 本地编译安装

LTP 本地编译安装
  • moonspiritacm
  • moonspiritacm
  • 2016年09月13日 15:15
  • 708

IMP-00041: 警告: 创建的对象带有编译警告解决办法

出现IMP-00041: 警告: 创建的对象带有编译警告: 以后再做数据迁移的时候需要额外注意,尤其用户中有视图或者触发器对象的时候。 用户的环境是这样的,在库里有三个oracle的用户,其中一个...
  • u012770274
  • u012770274
  • 2014年08月14日 11:13
  • 1636

VS2010配置jsoncpp解决编译出错问题

本人在最近的项目中使用到了jsoncpp来读取配置文件。经过多次实践终于vs2010中配置成功并能成功使用...
  • DriverUnload
  • DriverUnload
  • 2016年04月15日 15:50
  • 753

DEVC++编译奇怪报错问题解决

DEVC++编译奇怪报错问题解决 平时都是在linux下编软件,偶尔才会编两个windows工具程序方便大家使用。所以一直使用轻量级的IDE DEVC++来编译,但有天突然发现以前可以通过DEV...
  • u013401853
  • u013401853
  • 2017年01月22日 10:48
  • 1897

C++ 中的 Lambda 表达式

前些天买了本《程序设计语言理论》,看了简介,Lambda 演算贯穿整个理论,尤其在函数式语言中具有重要作用。C++11 中也加入了 Lambda 表达式,下面做个总结。1、一个简单的 Lambda 表...
  • Justme0
  • Justme0
  • 2014年05月08日 16:52
  • 1910
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++编译错误及解决办法
举报原因:
原因补充:

(最多只允许输入30个字)