我在C ++类中有一个静态stl映射,并且有另一个静态成员函数来返回一个指向映射中对象的常量指针。此映射对于类中的所有对象都是通用的。
唯一的问题是,我需要搜索这个地图并从另一个类中设置它,该类位于不同的.cpp / .h文件中,当我尝试在vs2010中编译它时,我得到了未解析的外部符号。这些方法在Timestream类中定义为
static void setRoomList(std::map<std::string, RoomDescription> rl);
static RoomDescription * getRoom(std::string ref);
这两个功能都是公开的,因此不存在访问问题。这些函数在Timestream.cpp文件中定义为正常,即
RoomDescription * Timestream::getRoom(std::string ref)
{
std::map<std::string, RoomDescription>::iterator cIter= roomList.find(ref);
if(cIter!=roomList.end())
return &(cIter->second);
return NULL;
}
我试着称之为
RoomDescription *r =Timestream::getRoom("Bathroom")
来自其他班级。网上的其他帖子似乎谈论使用extern,但我不确定。我不明白为什么这与从另一个类调用任何其他成员函数有什么不同?
谢谢, 詹姆斯
编辑: 是的,我已宣布
std::map<std::string, RoomDescription> roomList;
位于Timestream.cpp文件的顶部。在标题中,它被定义为
static std::map<std::string, RoomDescription> roomList;
我已将RoomDescription的标题包含在我试图从这些方法中调用这些方法的类的标题中。
我得到的错误就是这个
Import.obj:错误LNK2019:未解析的外部符号“public:static void __cdecl Timestream :: setRoomList(class std :: map,class std :: allocator&gt;,class RoomDescription,struct std :: less,class std: :allocator&gt;&gt;,class std :: allocator,class std :: allocator&gt; const,class RoomDescription&gt;&gt;&gt;)“(?setRoomList @Timestream @@ SAXV?$ map @ V?$ basic_string @ DU? $ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ VRoomDescription @@ U&$ @少V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ 2 @ V'$分配器@ U&$对@ $$ CBV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ VRoomDescription @@@ std @@@ 2 @@ std @@@ Z)在函数“public:int __thiscall Import :: getRoomData(void)”中引用(?getRoomData @ Import @@ QAEHXZ)
Timestream.obj:错误LNK2001:未解析的外部符号“private:static class std :: map,class std :: allocator&gt;,class RoomDescription,struct std :: less,class std :: allocator&gt;&gt;, class std :: allocator,class std :: allocator&gt; const,class RoomDescription&gt;&gt;&gt; Timestream :: roomList“(?roomList @Timestream @@ 0V?$ map @ V?$ basic_string @ DU?$ char_traits @ D @ @@ STD V'$分配器@ d @ @@ 2 STD @@ VRoomDescription @@ U&$ @少V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ 2 @ V'$分配器@ U&$ @配对$$ CBV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ VRoomDescription @@@ STD @@@ 2 @@ STD @@ A)
答案 0 :(得分:3)
您需要添加:
std::map<std::string, RoomDescription> Timestream::roomList;
到Timestream.cpp
,或者调用任何实现文件。
这将定义静态成员。在头文件中,您只能声明它。
答案 1 :(得分:2)
我猜测未解析的外部符号是roomList
;这是错误消息中包含的重要信息。并且,假设roomList
是在类定义中声明的静态成员。如果这些假设是正确的,那么错误的原因是代码没有roomList
的定义。
通常,静态成员必须在类定义中声明,并在源文件中定义:
// foo.h:
class C {
static int data;
};
// foo.cpp:
int C::data = 42;
这与从另一个类访问静态成员无关。如果您尝试从声明它的类中访问它,则会收到相同的错误。
编辑:从新发布的错误消息中,有两个缺少的名称:setRoomList
和roomList
。请注意roomList
是Timestream
的成员,必须这样定义,也就是说,它的定义必须包含Timestream::
。如上所示,它只是一个全局数据对象,而不是Timestream
的成员。 setRoomList
的问题可能相同。