boost::function 静态成员变量
Posted
技术标签:
【中文标题】boost::function 静态成员变量【英文标题】:boost::function static member variable 【发布时间】:2013-05-30 16:52:49 【问题描述】:我正在尝试将 boost::function 存储为“引用?”的静态变量。从函数中获取。
变量如下所示:
static boost::function<void( const wchar_t*, const bool)> s_logMessage;
当我尝试编译时出现错误:
错误 LNK2001:未解析的外部符号“公共:静态类 boost::function Gorbatras_Converter::ConverterApp::s_logMessage”(?s_logMessage@ConverterApp@Gorbatras_Converter@@2V?$function@$$A6AXPB_W_N@Z@boost@@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 函数保存在静态变量中?
【问题讨论】:
小提示:注意在这两种情况下你都可以编译它而不会出错。是 linker 发出错误(在适当的时候)。 您需要在命名空间范围内进行定义:boost::function<void( const wchar_t*, const bool)> ConverterApp::s_logMessage;
我不同意这个骗局。链接的问题所要求的远远超出解决该问题所需的知识。首先必须阅读文本页面的人对 *** 不满意,并会尝试查看下一个谷歌结果。投票重新开放...
@JohannesSchaub-litb:阅读和研究发生了什么?
如果您不需要阅读的信息,@LightnessRacesinOrbit 阅读将无济于事。研究是好的,但如果你不能做到这一点并且只是想获得快速帮助(我完全赞成为欺骗投票,并避免在多个问题上传播好的答案。但只是进行过于激进的近距离投票(或很大程度上?)强迫人们进行“阅读和研究”似乎是错误的。*** 不是那样)。
【参考方案1】:
您缺少静态数据成员的定义(您的类定义中只有该成员的声明)。将以下内容放在命名空间范围内:
boost::function<void( const wchar_t*, const bool)> ConverterApp::s_logMessage;
如果您从不使用数据成员(从技术上讲,如果它不是 odr-used,请参阅 C++11 标准的第 3.2 段),则不需要定义 - 因此行为你在观察。
【讨论】:
我们是要在每个静态数据成员问题上都写出相同的答案,还是使用 close as duplicate 函数? @LightnessRacesinOrbit:与寻找副本相比,我编写它所花费的时间更少,而且 OP 理解这个答案所花费的时间比弄清楚他们的问题与链接问题的关系要短.每次 OP 缺少分号时,我们是否要查找重复项? 当 OP 缺少分号时,我们将关闭 too localized。 SO 不是众包代码调试机器。并且 OP 应该习惯于在他的问题上花费超过 20 秒 - 如果必须真正阅读现有的 Stack Overflow 答案是培训的一个步骤,那就这样吧!你在鼓励帮助吸血鬼。 @LightnessRacesinOrbit:好的,删除并投票关闭。以上是关于boost::function 静态成员变量的主要内容,如果未能解决你的问题,请参考以下文章