如何解决这个未声明的标识符

How to solve this undeclared identifier

我的项目出现未声明的标识符错误(vs2013 上的 C2065),我设法在下面的示例代码中重现了该问题:

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 Express 2013 上构建时,出现以下错误:

错误 C2065:'Foo':未声明的标识符

错误 C2923:'std::map':'Foo' 不是参数“_Ty”的有效模板类型参数

错误 C3861:'someFunction':找不到标识符

这里有什么问题,如何解决?

问题是由 foo.h 和 bar.h 之间的循环依赖引起的。它 可以使用以下任何一种我能想到的方法来解决。

方法一

  1. 在 bar.h.
  2. 中使用 class Foo 的前向声明
  3. 不要在 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();

方法二

  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(); }

方法三

同时使用方法 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。作为一般指南,最好 如果您不需要完整的,请在头文件中使用前向声明 class.

的定义

你有一个循环定义问题。请注意,foo.h 包括 bar.h bar.h 包括 foo.h。这是行不通的,因为这意味着在另一个定义先完成之前,这两个定义都无法完成。真正解决此问题的唯一方法是更改​​结构,使 header 之一不会 #include 另一个 header.