2015-06-27 95 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,同意你的评论。到现在为止,无法回头修复答案。 –