2013-01-09 68 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