2013-01-09 142 views
1

内FileThree.h命名空间与多个文件

#ifndef FILETHREE 
#define FILETHREE 
namespace blue{} 
class Filethree 
{ 
public: 
    Filethree(void); 
    ~Filethree(void); 
}; 
#endif 

内FileThree.cpp

#include "Filethree.h" 
#include<iostream> 
using namespace std ; 
namespace blue{ 
    void blueprint(int nVar){ 
     cout<<"red::"<<nVar<<endl; 
    } 
} 
Filethree::Filethree(void) 
{ 
} 

Filethree::~Filethree(void) 
{ 
} 

内FileFour.h

#ifndef FILEFOUR 
#define FILEFOUR 
namespace red{} 
class FileFour 
{ 
public: 
    FileFour(void); 
    ~FileFour(void); 
}; 
#endif 

内FileFour.cpp

#include "FileFour.h" 
#include<iostream> 
using namespace std; 
namespace red{ 
    void redprint(double nVar){ 
     cout<<"red::"<<nVar<<endl; 
    } 
} 
FileFour::FileFour(void) 
{ 
} 

FileFour::~FileFour(void) 
{ 
} 

里面的main.cpp

#include "FileFour.h" 
#include "Filethree.h" 
using namespace red ; 
using namespace blue ; 

int main() 
{ 
    blueprint(12); 
return 0; 
} 

当我编译上面的文件,它给了我下面的错误。

error C3861: 'blueprint': identifier not found 

有谁能告诉我为什么我得到这个错误?

回答

5

编译器在未在头文件中声明时找不到函数。 您需要FileThree.h声明blueprint功能namespace blue

FileThree.h:

namespace blue{ 
    void blueprint(int nVar); 
} 

同向redprint功能,需要声明它FileFour.h里面namespace red

FileFour.h

namespace red{ 
    void redprint(double nVar); 
} 
+0

但我已经在cpp文件中声明了相同的内容,并在头文件中给出了一个前向声明。我错过了什么吗? – Kenta

+0

你错过了我所说的。 :)在.cpp文件中的定义可以在链接时看到。 – billz

+0

所以只有头文件编译和链接期间,他们链接到CPP文件来获得定义。请纠正,如果我错了。 – Kenta

0

Inside FileFour.h

#ifndef FILEFOUR 
#define FILEFOUR 
namespace red{ 
    void redprint(int nVar);   
} 
class FileFour 
{ 
public: 
    FileFour(void); 
    ~FileFour(void); 
}; 
#endif 

内部FileFour.cpp

#include "FileFour.h" 
#include<iostream> 
using namespace std; 
void red::redprint(int nVar) 
{ 
    cout<<"red"<<nVar<<endl; 
} 
FileFour::FileFour(void) 
{ 
} 

FileFour::~FileFour(void) 
{ 
} 

内部Filethree.h

#ifndef FILETHREE 
#define FILETHREE 
namespace blue{ 
    void blueprint(int nVar);  
} 
class Filethree 
{ 
public: 
    Filethree(void); 
    ~Filethree(void); 
}; 
#endif 

内部Filethree.cpp

#include "Filethree.h" 
#include<iostream> 
using namespace std ; 
void blue::blueprint(int nVar) 
{ 
    cout<<"blue"<<nVar<<endl; 
} 
Filethree::Filethree(void) 
{ 
} 

Filethree::~Filethree(void) 
{ 
} 

内部的main.cpp

#include <iostream> 
using namespace std; 
#include "FileFour.h" 
#include "Filethree.h" 
using namespace blue ; 
int main() 
{ 
    blueprint(12); 
return 0; 
} 

定义应该在cpp文件里面作为头文件中的声明。

+0

在FileThree.h和FileFour.h中删除'extern' – billz

+0

你现在可以确认错误吗? – billz

+0

也删除extern之后,它不会给出任何错误。请参阅我编辑的帖子。 无论如何感谢您提供链接,这有助于我理解编译和链接过程。 – Kenta