0

我正在尝试在 VS2010 中构建别人的代码。它在 VS2005 中构建良好,但我需要升级它。

他们在标题中定义了如下宏:

#include <boost/scoped_ptr.hpp>
#include <boost/utility.hpp>
#include <boost/thread/once.hpp>

#define DEFINE_SINGLETON(name) boost::scoped_ptr<name> Singleton<name>::_instance

template<class T> class Singleton : private boost::noncopyable
{
    public:
        static T& instance() 
        {
            boost::call_once(init, flag);        
            return *_instance;
        }

        static void init()  
        {
            _instance.reset(new T());
        }

    protected:
        Singleton() {}
        ~Singleton() {}

    private:
        static boost::scoped_ptr<T> _instance;
        static boost::once_flag flag;
};

template<class T> boost::once_flag Singleton<T>::flag = BOOST_ONCE_INIT;

我现在已经设法构建代码,但是我收到了很多关于这个宏的链接器错误:

project1.lib(file1.obj) : error LNK2001: unresolved external symbol "private: static class boost::scoped_ptr<class ClassABC> Singleton<class ClassABC>::_instance" (?_instance@?$Singleton@VClassABC@@@@0V?$scoped_ptr@VClassABC@@@boost@@A)

正在使用的宏示例(在源文件中):

#include "singleton.h"
DEFINE_SINGLETON(ClassABC);

我对 Boost 和模板都很陌生(对不起),所以我无法理解为什么在 VS2005 中所有链接都很好时会出现这些错误。值得注意的是,为了进行升级,我们还必须升级我们的 Boost 版本,所以这可能是一个因素 - 已经执行了一些检查:

  • 头文件包含在源文件中
  • 添加了 Boost 目录以包含目录(在 VC++ 目录下的属性页面下)
  • 将 boost lib 目录添加到 Linker -> General -> Additional library dependencies

有关信息,我正在 Win32 上编译一个多线程调试 dll。

我花了一天的大部分时间谷歌搜索无济于事,所以非常感谢任何帮助!

非常感谢 :)

4

1 回答 1

0

我没有看到您在发布的代码中的任何地方都使用了宏。

您需要将其用作:

//add this line after BOOST_ONCE_INIT or before it, or wherever you see fit.
template<class T> DEFINE_SINGLETON(T);

我个人更喜欢这个:

template<class T> boost::scoped_ptr<T> Singleton<T>::_instance;
于 2012-05-23T14:28:10.090 回答