2012-09-07 209 views
-1

所以我有静态成员我的头文件:C++类的静态成员

#ifndef PROFILE_MANAGER_H 
#define PROFILE_MANAGER_H 

#include <map> 
#include <vector> 

using namespace std; 
using std::vector; 

namespace Engine 
{ 
    class ProfileManager 
    { 
    private: 
     static map<const char*, vector<float>> profiles; 
     static map<const char*, vector<float>>::iterator it; 
     static pair<map<const char*, vector<float>>::iterator, bool> ret; 
    }; 
} 

#endif 

而且在我的cpp文件我有定义:

#include "ProfileManager.h" 

namespace Engine 
{ 
    map<const char*, vector<float>> ProfileManager::profiles; 
    map<const char*, vector<float>>::iterator ProfileManager::it; 
    pair<map<const char*, vector<float>>::iterator, bool> ProfileManager::ret; 
} 

链接器总是抱怨的静态成员是即使我已经在cpp文件中定义了它们,也是无法解析的外部(LNK2001)。任何想法为什么?

+3

我更惊讶*编译器*不会抱怨丢失的分号! –

+1

更不用说重复使用右移运算符。 – WhozCraig

+1

你确定你正在编译cpp文件? –

回答

2

这些类型的错误通常发生在链接器未被赋予cpp编译结果的obj文件时。

在您的输出目录中查找ProfileManager.obj。如果它不存在,那就错了。可能cpp文件不是按照Luchian Grigore的建议编译的。也有可能连接器没有被赋予参数中的obj文件。如果您使用visual studio,请检查cpp文件是否为项目的一部分。在其他环境中,请参阅链接器被调用的命令。

如果使用Visual Studio,则可以打开项目属性 - >链接器 - >命令行,并在Additional Option中添加/ VERBOSE。然后打开输出窗口并重新编译项目。 (谢谢克雷格的评论)。

可能发生的另一种情况。您将头文件包含在另一个项目中,并且您试图在不引用ProfileManager.cpp所在的项目的情况下进行构建。

+1

如果你真的想知道什么是搜索这些符号,你也可以为你使用的任何工具集提升链接器输出,在VC++中,它在链接器输出设置配置上非常简单。只要你有这样的问题,你可以/应该总是把这个问题转化为了解被搜索的内容以解决被追踪的ID。 – WhozCraig