2015-06-27 80 views
0

我讓我的項目中未聲明的標識符錯誤(C2065上vs2013),我成功地複製在下面的示例代碼中的問題:如何解決這個未聲明的標識符

了foo.h:

#pragma once 

#include "bar.h" 

class Foo 
{ 

public: 
    inline void doStuff() { someFunction(); } 

}; 

bar.h:

#pragma once 

#include <map> 

#include "foo.h" 

extern std::map<const char*, Foo> myMap; 

void someFunction(); 

bar.cpp:

#include "bar.h" 

std::map<const char*, Foo> myMap; 

void someFunction() 
{ 

} 

main.cpp中:

#include "foo.h" 

int main() 
{ 
    Foo foo; 
    foo.doStuff(); 
    return 0; 
} 

當Visual Studio速成2013建築,它給了這些錯誤:

錯誤C2065: '富':未聲明的標識符

錯誤C2923:「的std ::地圖」:‘富’不是參數的有效模板類型參數‘_Ty’

錯誤C3861:‘someFunction’:標識符找不到

這裏有什麼問題,它如何解決?

回答

4

你有一個循環定義問題。請注意,foo.h包含bar.h bar.h包含foo.h.這是行不通的,因爲這意味着直到另一個定義首先完成才能完成定義。你可以真正解決這個問題的唯一方法是改變你的結構,使其中一個標題不是#include的另一個標題。

+1

並轉發引用您從中移除include的類中的類。 – Robinson

+0

感謝您的建議,通過將#include從頭文件移動到cpp文件來解決問題。 –

0

該問題是由foo.h和bar.h之間的循環依賴引起的。它可以使用我能想到的以下任何方法解決。

方法1

  1. 在bar.h.使用類Foo的向前聲明
  2. 請勿在bar.h中使用#include "foo.h"

了foo.h:

#pragma once 

#include "bar.h" 

class Foo 
{ 

public: 
    inline void doStuff() { someFunction(); } 

}; 

bar.h:

#pragma once 

#include <map> 

// #include "foo.h" 
class Foo; 

extern std::map<const char*, Foo> myMap; 

void someFunction(); 

方法2

  1. 創建foo.cpp並將其添加到項目中。
  2. Foo::doStuff()的實現移至foo.cpp。
  3. 請勿在foo.h中使用#include "bar.h"

了foo.h:

#pragma once 

class Foo 
{ 

public: 
    void doStuff(); 

}; 

bar.h:

#pragma once 

#include <map> 

#include "foo.h" 

extern std::map<const char*, Foo> myMap; 

void someFunction(); 

FOO。CPP:

#include "foo.h" 
#include "bar.h" 

void Foo::doStuff(){ someFunction(); } 

方法3

使用兩個方法1方法2

了foo.h:

#pragma once 

class Foo 
{ 

public: 
    void doStuff(); 

}; 

bar.h:

#pragma once 

#include <map> 

// #include "foo.h" 
class Foo; 

extern std::map<const char*, Foo> myMap; 

void someFunction(); 

Foo.cpp中:

#include "foo.h" 
#include "bar.h" 

void Foo::doStuff(){ someFunction(); } 

我強烈建議使用方法3。作爲一般指南,如果您不需要完整的 定義,最好 在頭文件中使用前向聲明。

+0

這是行不通的,bar.h需要知道Foo類。 –

+0

這是解決循環依賴關係的最壞方法。 –

+0

@LightnessRacesinOrbit,同意你的評論。到現在爲止,無法回頭修復答案。 –