unionのメンバーにはコンストラクション関数は使用できません

3484 ワード

最近プロジェクトのCTAテストをしていて、振り回されて死にそうです....
 
プロジェクトで使用されるオープンソースライブラリAllJoynは、コンパイル時にエラーが発生しました.
In file included from ./Target/base/AllJoyn/Inc/alljoyn/Message.h:36:0,

                 from ./Target/base/AllJoyn/Inc/alljoyn/AuthListener.h:5,

                 from ./Data/../Target/base/AllJoyn/Inc/alljoyn/BusAttachment.h:37,

                 from ./Data/SUTHeader.h:306,

                 from ./Data/Data_Caster.h:1,

                 from ./Data/StubMacroDefine.h:5,

                 from ./CTATestDriverHeader.h:9,

                 from Target/ExternMethod_stub.cpp:1:

./Target/base/AllJoyn/Inc/alljoyn/MsgArg.h:284:15: error: member ‘ajn::AllJoynArray ajn::MsgArg::<anonymous union>::v_array’ with constructor not allowed in union

Exception: error status 1 from /usr/local/bin/g++

make: *** [Target/ExternMethod_stub.o] Error 1

コンパイラエラーはajn::MsgArgのメンバーv_です.Array(ajn::AllJoynArray)には構造関数があるべきではありません.
 
知識点:
  • c++のunionにおけるデータメンバーは、構造関数を許可しない
  • である.
    以前はまだこれを知りませんでした(unionは少ないので)、もっと多くの解釈はここを見てください:http://blog.chinaunix.net/uid-27661220-id-3346412.html
     
    しかし、これはオープンソースライブラリで、これまで単独でコンパイルしても大丈夫だったでしょう.ソースコードを開いてajn::AllJoynArrayの定義を表示します.
    class AllJoynArray {
    
    public:
    
            AllJoynArray();// compiler generated constructor
    
    CTA_PRIVATE: bool _m_bCTAStubVariable_;
    
    ...
    
    }

    確かに構造関数がありますが、注釈「compiler generated constructor」を見るとCTAが自動的に挿入したようです.そこでAllJoynの元のコードを比較すると、やはりそうです.
    坑お父さん...
     
    原因を知っている以上、解決は簡単です.
    CTAが自動的に挿入するコンストラクション関数AllJoynArray::AllJoynArray()を削除すればよい.
     
    ps:
    最后にもう1つのCTAテストは本当に穴のお父さんの游び物で、すでにそれに苦しめられて何日も、多く言ってすべて涙です!