`
ah_fu
  • 浏览: 223254 次
  • 性别: 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++》程序设计

    实验一、C++开发环境应用入门(2学时) <br>1、实验目的 了解C++开发工具的特点 熟悉C++开发环境 学习用C++编写标准的C++程序 2、实验任务 使用C++来建立一个非图形化的标准C++程序,编译、...

    C++简述小程序

    用main代表“主函数”的名字。每一个C++程序都必须有一个 main 函数。main前面的int的作用是声明函数的类型为整型。程序第6行的作用是向操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零...

    信息技术c++.docx

    1、程序设计 【例1】 阅读以下程序: #include <iostream> //以"#"开头为编译预处理行,即头文件 using namespace std; //为变量名开辟内存空间,即命名空间 int main() //主函数 { cout!"; return 0; } 程序就是为...

    C++日志类libglog使用

    Google glog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例: LOG(INFO) ; “LOG”宏为日志输出关键字,“INFO”为严重性程度。 主要支持功能: 1, 参数设置,以命令行参数的方式...

    log4cplus 源码(C++编写的开源的日志系统)

    不需要安装,有一个msvc6存放包括源代码和用例在内的开发工程(for VC6 only),使用之前请先编译 "log4cplus_dll class"工程生成dll,或者编译"log4cplus_static class"工程生成lib. ### 使用前的配置 ### 1. ...

    c#学习笔记.txt

    指定声明的类型和类型成员的可访问性。 访问不受限制 只有包含该类的成员的类可以访问 只有当前工程可以访问 只有包含该成员的类和继承的类可以访问 abstract指示某个类只能是其他类的基类。 const指定无法修改字段...

    c++ 面试题 总结

    一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如: const char *p; char c1='a'; char c2='b'; p=&c1;//ok p=&c2;//ok *p=c1;//error (2)...

    C++程序设计习题答案谭浩强

    在这部分中提供了由谭浩强编著的《C++程序设计》(清华大学出版社出版)一书中各章的例题程序,以方便教师进行教学,也便于读者上机运行这些程序以及在此基础上修改和调试程序。 程序按章设立文件夹(子目录),如文件夹...

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

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

    C++程序设计(谭浩强)例题和习题答案

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

    谭浩强版C++课后习题答案

    提供了由谭浩强编著的《C++程序设计》(清华大学出版社出版)一书中各章的例题程序以及全部习题的参考解答,以方便教师进行教学,也便于读者上机运行这些程序以及在此基础上修改和调试程序。读者运行光盘中Djgpp目录下...

    C++谭浩强+教材及上机+源代码

    在这部分中提供了由谭浩强编著的《C++程序设计》(清华大学出版社出版)一书中各章的例题程序,以方便教师进行教学,也便于读者上机运行这些程序以及在此基础上修改和调试程序。 程序按章设立文件夹(子目录),如文件夹...

    C++基础教程

    编辑和编译一个程序的方法取决于你用的是什么编译器,根据它是否有图形化的界面及版本的不同,编译方法也有可能不同,具体请参照你所使用的编译器的使用说明。 以上程序是多数初学者学会写的第一个程序,它的运行...

    最新名企标准通用C++面试题,

    这样声明之后,相当于告诉C, 函数const void f(void)是在C++语言的文件中声明或者实现的,c程序可以使用这个C++中的函数了,从而实现C++和c的混合编程。 13、编写一个函数,作用是把一个char组成的字符串...

    在一小时内学会 C#(txt版本)

    bool 和 string 类型均和 C++ 不同。bool 仅接受真、假而非任意整数。 用户定义类型文件包含: 1. 类 (class) 2. 结构(struct) 3. 接口(interface) 以下类型继承时均分配内存: 1. 值类型 2. 参考类型 ...

    c++ 谭浩强 程序设计ppt

    本资源提供了由谭浩强编著的《C++程序设计》(清华大学出版社出版)一书中各章的例题程序以及全部习题的参考解答,以方便教师进行教学,也便于读者上机运行这些程序以及在此基础上修改和调试程序。读者运行光盘中Djgpp...

    谭浩强C++程序设计习题答案

    在这部分中提供了由谭浩强编著的《C++程序设计》(清华大学出版社出版)一书中各章的例题程序,以方便教师进行教学,也便于读者上机运行这些程序以及在此基础上修改和调试程序。 程序按章设立文件夹(子目录),如...

    C++实验101

    使用Visual Studio 2017建立一个非图形化的标准C++程序,编译、运行例2.1,即以下程序: #include<iostream> using namespace std; int main() { cout”Hello!\n”; cout”Welcome to C++!\n”

    C#教程语法

    作为替代,它使用一个通用类库,这个类库也可以被诸如Visual Basic和Visual C++的语言所使用。 对于C和C++开发者来说,会有兴趣知道对一些没有出现在“Hello,world”程序的东西。 • 程序没有把Main设为全局方法。在...

    语言程序设计课后习题答案

    C++是一个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对C的类型系统进行了改革和扩充,因此C++比C更安全,C++的编译系统能检查出更多的类型错误。 C++语言最重要的特点是...

Global site tag (gtag.js) - Google Analytics