2013-05-30 118 views
0

我想存储一个boost :: function作为一个静态变量,其中的“引用?”从一个函数中获取。boost :: function静态成员变量

变量是这样的:

static boost::function<void(const wchar_t*, const bool)> s_logMessage; 

当我尝试编译我的错误:

error LNK2001: unresolved external symbol "public: static class boost::function Gorbatras_Converter::ConverterApp::s_logMessage" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@A)

我注意到,如果我不使用变量我可以编译它没有这个错误(猜测这是一个编译器优化,因为它没有使用),但只要我尝试使用s_logMessage变量,我得到链接错误。

我的设置s_logMessage的方式是这样的:

const int ConverterApp::RunConverter(boost::function<void(const wchar_t* a_message, const bool a_newLine)> a_logMessage) 
{ 
    ConverterApp::s_logMessage = a_logMessage;  
    ... 
} 

我试着将它设置为一个非静态成员变量,然后它似乎工作。但我需要它作为静态的,否则我可能会把它作为一个参数发送给我,因为它将会是很多功能。

如果你想知道为什么我发送一个日志功能作为参数,那是因为它来自一个单独的程序。

所以我需要帮助的是如何将boost :: function函数保存在静态变量中?

+1

小提示:请注意,在两种情况下都可以*编译*而不会出错。它是*链接器*发布错误(适当时)。 – Angew

+0

您需要在名称空间范围内定义:'boost :: function ConverterApp :: s_logMessage;' –

+0

我不同意这个重复。相关问题要求的不仅仅是解决这个问题所需要解决的问题。首先必须通过文本页面阅读的人不会满足于stackoverflow,并会尝试查看下一个google结果。投票重新开放... –

回答

5

您缺少的静态数据成员一个定义(你只有该成员的类定义中声明)。将下面的命名空间范围:

boost::function<void(const wchar_t*, const bool)> ConverterApp::s_logMessage; 

如果你从来不使用数据成员(从技术上讲,如果不是ODR使用的,见款C++ 11标准的3.2),那么该定义不需要 - 因此你正在观察的行为。

+0

我们是否会在每个静态数据成员问题上以相同的方式编写此答案,或者将_close作为duplicate_函数使用? –

+3

@LightnessRacesinOrbit:编写它比花时间去寻找一个重复的东西要少,而且OP需要更少的时间来理解这个答案,而不是找出他们的问题如何与链接问题相关。每次OP缺少分号时,我们是否需要查找重复项? –

+2

当OP缺少分号时,我们将以_too localised_关闭。 SO不是众包的代码调试机器。而且OP应该习惯花费超过20秒的时间解决他的问题 - 如果实际上需要读取一个现有的Stack Overflow答案,那么这个培训就是一步!你在鼓励帮助吸血鬼。 –