`
ah_fu
  • 浏览: 227921 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

c++学习:记一例namespace和类型声明引发的编译问题

阅读更多
    编码中发现一个奇怪的编译错误,花了很长时间才找到问题所在。下面把重现这个问题的最精简的代码贴出来:
/**//*
MyClass.h
存在一个namespace和一个类
*/


#ifndef _MY_CLASS_H_
#define _MY_CLASS_H_

namespace MySpace
...{

class MyClass
...{
public:
    
int Field;
}
;

}


#endif
    下面的一个文件声明一个全局的指针,因为仅仅指示声明,所以尽量不包含其他文件:
/**//*
global.h
声明一个全局的指针
*/


#ifndef _GLOBAL_H_
#define _GLOBAL_H_

class MyClass;           //对存在的类型做一个声明,不引入定义的头文件
extern MyClass* g_Obj;

#endif
    下面的文件使用全局变量和类型:
/**//*
use.cpp
这个文件里面使用全局对象指针和类型
*/


#include 
"MyClass.h"
#include 
"global.h"

void test1()
...{
    g_Obj 
= new MyClass();
    g_Obj
->Field = 1;
}


/**//*
g++ -o use.o -c use.cpp -g -Wall
*/

    编译use.cpp,产生了很多编译错误:
only_use.cpp: In function `void test1()':
only_use.cpp:11: error: invalid use of undefined type `struct MyClass'
global.h:9: error: forward declaration of `struct MyClass'
only_use.cpp:12: error: invalid use of undefined type `struct MyClass'
global.h:9: error: forward declaration of `struct MyClass'

    你可能会说,得加上using namespace MySpace;  实际上,这句加进去还是编译不过。当然,如果在global.h中包含MyClass.h,应该就能够编译过去了。但是我不想这么做,对于一个指针类型,其类型只要声明就好,不需要引入定义的。包含太多的头文件会引发编译问题的。
       试了很多办法,最后发现,在use.cpp中的#include "MyClass.h"后加入一行:using MySpace::MyClass; 然后代码就能够编译过去了。

     总结一下:对于存在于namespace中的类型,如果在某个头文件中对类型声明过,则在使用的时候要注意:
1、类型的定义文件包含在前(#include "MyClass.h")
2、声明namespace中的类型(using MySpace::MyClass;)
3、然后包含全局指针的声明文件(#include "global.h")
4、在其后使用就没问题了


 
分享到:
评论

相关推荐

    C++经典编程200例

    《C++经典编程200例》是一本深入学习C++编程技术的实践教程,它包含了大量的实际编程示例,旨在帮助读者通过实践掌握C++的核心概念和编程技巧。本书覆盖了C++语言的各个方面,从基础语法到高级特性,为初学者提供了...

    c++例题分析vc例题分析

    例如,如果程序 c4-4-1.cpp 在 Visual C++ 6.0 环境下编译,第 1 行应改为“include ”,并将第 2 行“using namespace std;”取消即可顺利通过编译。 四、特殊程序 在教材的例题程序中还提供了能在 Visual C++ ...

    C++ 程序设计课件:第一章 C++基础知识.ppt

    例如,一个简单的C++程序通常会包含头文件(如`#include <iostream>`)、命名空间(如`using namespace std;`)、函数(如`max`和`main`)以及输入输出操作(如`cin`和`cout`)。程序的执行入口是主函数`main()`,而...

    linux下C++连接数据库程序源码附加编译命令

    在Linux环境下,使用C++进行数据库编程是一项常见的任务,它涉及到多方面的技术,包括数据库API的使用、编译环境的配置以及程序的构建过程。本文将深入探讨如何在Linux下用C++编写连接数据库的程序,并附上编译命令...

    C++MFC教程

    - **C++**: 一种广泛使用的高级编程语言,支持多种编程范式,包括过程化编程、面向对象编程和泛型编程。C++以其高效性和灵活性著称,在系统软件、游戏开发、嵌入式系统等领域有着广泛应用。 - **MFC (Microsoft ...

    信息技术c++.docx

    【C++程序设计基础】 C++是一种广泛应用的高级编程语言,尤其因其面向对象...通过学习C++,开发者可以掌握程序设计的基础,从而解决更复杂的计算和系统设计问题。在实践中,不断练习编写和理解代码,是掌握C++的关键。

    C++入门经典 习题答案

    - 此例展示了C++中最基本的程序结构,包括包含头文件`#include <iostream>`,命名空间`using namespace std;`的声明,以及`main()`函数的定义。`cout`是标准输出流对象,用于向控制台输出文本。“endl”是一个预定...

    C++程序设计实验指导

    【C++程序设计实验指导】是针对初学者的实践教程,特别适合大一学生学习,旨在帮助他们理解和掌握C++编程基础。实验的核心内容包括熟悉集成开发环境(IDE)、基本的程序编辑、编译、调试以及掌握C++中的选择结构语句...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    linux下编写最简单C++程序的过程屏幕录像

    在Linux环境下编写C++程序是许多初学者踏入编程世界的必经之路。...这是一个重要的起点,随着对C++和Linux理解的加深,你可以进一步学习更复杂的数据结构、算法和系统编程等内容,从而成为熟练的C++程序员。

    C++连接mysql例子

    在C++编程中,连接MySQL数据库并执行查询是常见的任务,尤其在开发涉及后端数据处理的应用时。本文将详细讲解如何使用C++连接到MySQL数据库,并进行查询操作,以实现"mysqlTest"中的功能。 首先,我们需要一个库来...

    C++汉字转拼音

    在IT领域,尤其是在编程实践中,有时我们需要将汉字转换为拼音,以便...无论哪种方式,都需要对C++和Windows编程有扎实的理解,以及耐心去解决可能出现的兼容性问题。在这个过程中,不断学习和实践是提升技术的关键。

    C++基础教程

    了解了C++的基础知识后,下一步可以深入学习变量、数据类型、运算符、控制结构、函数、类和对象等主题。随着学习的深入,你将能编写更复杂的程序,利用C++的高级特性,如模板、异常处理和STL(Standard Template ...

    高级语言C++程序设计编程范例与精解

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程等多种编程范式。由Bjarne Stroustrup于1979年在贝尔实验室开始设计开发,最初被命名为“C with ...

    c++学号和对应成绩打印总分和平均分

    从给定的代码片段来看,这段C++代码旨在实现一个简单的功能:输入10个学生的学号和对应的成绩,然后计算并打印出所有学生的总分和平均分。然而,代码中存在一些错误和不当之处,这包括数组下标使用方式的错误以及...

Global site tag (gtag.js) - Google Analytics