如何解决这个未声明的标识符
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 之间的循环依赖引起的。它
可以使用以下任何一种我能想到的方法来解决。
方法一
- 在 bar.h.
中使用 class Foo
的前向声明
- 不要在 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();
方法二
- 创建 foo.cpp 并将其添加到项目中。
- 将
Foo::doStuff()
的实施移动到 foo.cpp。
- 不要在 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.
我的项目出现未声明的标识符错误(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 之间的循环依赖引起的。它 可以使用以下任何一种我能想到的方法来解决。
方法一
- 在 bar.h. 中使用 class
- 不要在 bar.h 中使用
#include "foo.h"
。
Foo
的前向声明
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();
方法二
- 创建 foo.cpp 并将其添加到项目中。
- 将
Foo::doStuff()
的实施移动到 foo.cpp。 - 不要在 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.