0

std::atomicメンバー関数へのポインターを含むがあります。g ++ 4.4.5ではすべてが正常にコンパイルされますが、リンク中に次のエラーが発生します。

./pool.o: In function `pool::worker::worker(pool&, int, int)':
pool.cpp:(.text._ZN4pool6workerC1ERS_ii[pool::worker::worker(pool&, int, int)]+0x95): undefined reference to `std::atomic<void (pool::* const*)(unsigned int, unsigned int, pool::worker*)>::store(void (pool::* const*)(unsigned int, unsigned int, pool::worker*), std::memory_order) volatile'
./pool.o: In function `pool::worker::give_job(void (pool::* const&)(unsigned int, unsigned int, pool::worker*), unsigned int, unsigned int)':
pool.cpp:(.text._ZN4pool6worker8give_jobERKMS_FvjjPS0_Ejj[pool::worker::give_job(void (pool::* const&)(unsigned int, unsigned int, pool::worker*), unsigned int, unsigned int)]+0x142): undefined reference to `std::atomic<void (pool::* const*)(unsigned int, unsigned int, pool::worker*)>::store(void (pool::* const*)(unsigned int, unsigned int, pool::worker*), std::memory_order) volatile'
./pool.o: In function `pool::worker::soul()':
pool.cpp:(.text._ZN4pool6worker4soulEv[pool::worker::soul()]+0xf1): undefined reference to `std::atomic<void (pool::* const*)(unsigned int, unsigned int, pool::worker*)>::store(void (pool::* const*)(unsigned int, unsigned int, pool::worker*), std::memory_order) volatile'

の揮発性のオーバーロードにリンクしようとしている理由を私は本当に理解していません。store()ソースでは、メンバー関数へのポインターはそうではconstありませんvolatile(そしてコンパイルされます)。

同じコードがg++4.6.3でコンパイルされます

4

1 に答える 1

3

シンプル:GCC 4.4はこれをサポートしていなかったか、経験した方法で壊れています。新しいGCCの方がサポートが優れており、正常に機能します。

于 2012-06-25T11:20:50.810 に答える