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 dir が追加され、dirs が含まれるようになりました (VC++ dirs inproperty ページの下)。
  • Boost lib dir をリンカーに追加 -> 一般 -> 追加のライブラリ依存関係

情報については、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 に答える