C++ boost::函数静态成员变量

C++ boost::函数静态成员变量,c++,boost,C++,Boost,我试图将boost::函数存储为静态变量,其中“reference?”是从函数中获取的 变量如下所示: static boost::function<void( const wchar_t*, const bool)> s_logMessage; 静态boost::函数s_logMessage; 当我尝试编译时,会出现以下错误: 错误LNK2001:未解析的外部符号“public:静态类boost::function Gorbatras_Converter::ConverterA

我试图将boost::函数存储为静态变量,其中“reference?”是从函数中获取的

变量如下所示:

static boost::function<void( const wchar_t*, const bool)> s_logMessage;
静态boost::函数s_logMessage;
当我尝试编译时,会出现以下错误:

错误LNK2001:未解析的外部符号“public:静态类boost::function Gorbatras_Converter::ConverterApp::s_logMessage”(?s_logMessage@ConverterApp@Gorbatras_转换器@@2V?$函数@$$A6AXPB_W_N@Z@助推@@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;    
    ...
}
const int ConverterApp::RunConverter(boost::function a_logMessage)
{
ConverterApp::s_logMessage=a_logMessage;
...
}
我试着将它设置为非静态成员变量,然后它似乎可以工作。但是我需要它是静态的,否则我可能会把它作为一个参数发送,我不想要它,因为它会有很多函数

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

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

缺少静态数据成员的定义(在类定义中只有该成员的声明)。将以下内容放在命名空间范围中:

boost::function<void( const wchar_t*, const bool)> ConverterApp::s_logMessage;
boost::function ConverterApp::s_logMessage;
如果从未使用数据成员(从技术上讲,如果未使用odr,请参见C++11标准的第3.2段),则不需要定义-因此您观察到的行为。

您缺少静态数据成员的定义(在类定义中只有该成员的声明)。将以下内容放在命名空间范围中:

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


如果您从未使用数据成员(从技术上讲,如果未使用odr,请参见C++11标准的第3.2段),则不需要定义-因此您观察到的行为。

我们是否要对每个静态数据成员问题以相同的方式编写此答案,或者使用close as duplicate功能?@Lightness Race Sinorbit:我写这篇文章所花的时间少于寻找一个副本,OP理解这个答案所花的时间也少于找出他们的问题与链接的问题之间的关系。我们是否要在每次OP缺少分号时寻找重复项?当OP缺少分号时,我们将关闭,因为过于本地化。所以不是一个众包代码调试机器。OP应该习惯在他的问题上花费超过20秒的时间——如果必须阅读现有的堆栈溢出答案是训练的一个步骤,那么就这样吧!你在鼓励帮助吸血鬼。@LightnessRacesinOrbit:好的,删除并投票关闭。我们是要在每个静态数据成员问题上以相同的方式写下这个答案,还是使用close as duplicate函数?@LightnessRacesinOrbit:我写它比寻找一个重复的要少,对于OP来说,理解这个答案所需的时间要少于找出他们的问题与相关问题之间的关系所需的时间。我们是否要在每次OP缺少分号时寻找重复项?当OP缺少分号时,我们将关闭,因为过于本地化。所以不是一个众包代码调试机器。OP应该习惯在他的问题上花费超过20秒的时间——如果必须阅读现有的堆栈溢出答案是训练的一个步骤,那么就这样吧!您在鼓励帮助吸血鬼。@LightnessRacesinOrbit:很好,删除并投票关闭。小提示:注意,在这两种情况下,您都可以编译它而不会出错。是链接器发出了错误(在适当的时候)我不同意这个傻瓜。关联问题所要求的远不止解决该问题所需知道的内容。首先必须阅读文本页面的人对stackoverflow并不满意,他们将尝试查看下一步的谷歌搜索结果。投票重开…@JohannesSchaub litb:阅读和研究怎么了?@LightnessRacesinOrbit reading如果你不需要阅读的信息,那就没用了。研究是好的,但如果你不能胜任,只是想得到快速的帮助,那就不行了(我完全支持投票给dupe,避免在多个问题上散布好的答案。但是,仅仅(或大部分?)通过激烈的近距离投票迫使人们进行“阅读和研究”似乎是错误的。Stackoverflow并不是这样).小提示:请注意,在这两种情况下,您都可以编译它而不会出错。是链接器发出了错误(在适当的时候)我不同意这个傻瓜。关联问题所要求的远不止解决该问题所需知道的内容。首先必须阅读文本页面的人对stackoverflow并不满意,他们将尝试查看下一步的谷歌搜索结果。投票重开…@JohannesSchaub litb:阅读和研究怎么了?@LightnessRacesinOrbit reading如果你不需要阅读的信息,那就没用了。研究是好的,但如果你不能胜任,只是想得到快速的帮助(我完全支持dupe,并避免将好的答案分散在多个问题上。但仅仅(或大部分?)强迫人们进行“阅读和研究”似乎是错的。Stackoverflow并不是这样)。