4

同様の質問が少なくとも1 つありますが、まだ解決されておらず、より複雑に思われるため、私はまだ質問しています。私は自分のものを単純化しようとしています。

以下のように .h を使用する .cpp ファイルがあり、これらの小屋をコンパイルすると次のようなエラーが発生します。どんなアイデアでも大歓迎です。問題のある部分のみを最小限に抑えるために、コードは簡略化されていることに注意してください。

FC_boost_prove.h:

#ifndef FC_H
#define FC_H

#include <vector>
#include "iostream"

#include "boost/signal.hpp"
#include "boost/bind.hpp"
#include <boost/random.hpp>

typedef boost::signal0<void()> PreUpdateSignal;
typedef PreUpdateSignal::slot_function_type PreUpdateSlot;
typedef boost::signal0<void()> PostUpdateSignal;
typedef PostUpdateSignal::slot_function_type PostUpdateSlot;

class FC {
public:
    FC(uint width, uint height) {
        std::cout << "In constructor." << std::endl;
    }
    ~FC() {
        //Do ...
    }
    void connectPreUpdate(PreUpdateSlot s) {
        preUpdateSignal_.connect(s);
    }
    void connectPostUpdate(PostUpdateSlot s) {
        postUpdateSignal_.connect(s);
    }

protected:
    PreUpdateSignal preUpdateSignal_;
    PostUpdateSignal postUpdateSignal_;
};
#endif

FC_boost_prove.cpp:

#include <iostream>
#include <string>
#include "FC_boost_prove.h"

int main() {
    std::cout << "test." << std::endl;
}

コンパイル エラー:

$ g++ FC_boost_prove.cpp 
In file included from /usr/include/boost/signals/signal_template.hpp:22,
                 from /usr/include/boost/signals/signal0.hpp:24,
                 from /usr/include/boost/signal.hpp:19,
                 from FC_boost_prove.h:7,
                 from FC_boost_prove.cpp:3:
/usr/include/boost/last_value.hpp: In instantiation of ‘boost::last_value<void()>’:
/usr/include/boost/signals/signal_template.hpp:178:   instantiated from ‘boost::signal0<void(), boost::last_value<void()>, int, std::less<int>, boost::function0<void()> >’
FC_boost_prove.h:12:   instantiated from here
/usr/include/boost/last_value.hpp:22: error: function returning a function
In file included from /usr/include/boost/signals/signal0.hpp:24,
                 from /usr/include/boost/signal.hpp:19,
                 from FC_boost_prove.h:7,
                 from FC_boost_prove.cpp:3:
/usr/include/boost/signals/signal_template.hpp: In instantiation of ‘boost::signal0<void(), boost::last_value<void()>, int, std::less<int>, boost::function0<void()> >’:
FC_boost_prove.h:12:   instantiated from here
/usr/include/boost/signals/signal_template.hpp:330: error: function returning a function
/usr/include/boost/signals/signal_template.hpp:370: error: function returning a function
In file included from /usr/include/boost/function/detail/maybe_include.hpp:13,
                 from /usr/include/boost/function/function0.hpp:11,
                 from /usr/include/boost/signals/signal_template.hpp:38,
                 from /usr/include/boost/signals/signal0.hpp:24,
                 from /usr/include/boost/signal.hpp:19,
                 from FC_boost_prove.h:7,
                 from FC_boost_prove.cpp:3:
/usr/include/boost/function/function_template.hpp: In instantiation of ‘boost::function0<void()>’:
FC_boost_prove.h:24:   instantiated from here
/usr/include/boost/function/function_template.hpp:1006: error: function returning a function
/usr/include/boost/function/function_template.hpp: In instantiation of ‘boost::detail::function::basic_vtable0<void()>’:
/usr/include/boost/function/function_template.hpp:856:   instantiated from ‘void boost::function0<R>::clear() [with R = void()]’
/usr/include/boost/function/function_template.hpp:752:   instantiated from ‘boost::function0<R>::~function0() [with R = void()]’
/usr/include/boost/signals/slot.hpp:105:   instantiated from here
/usr/include/boost/function/function_template.hpp:486: error: function returning a function
/usr/include/boost/function/function_template.hpp:643: error: function returning a function

環境: Ubuntu 10.10、g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

4

1 に答える 1

4

なぜあなたは指定していboost::signal0<>ますか?シグナルNテンプレートは、関数シグネチャを適切に解析できない欠陥のあるコンパイラ用です。

最新のコンパイラで推奨されているように、シグナルを使用して関数シグネチャを指定します。

typedef boost::signal<void()> PreUpdateSignal;
typedef boost::signal<void()> PostUpdateSignal;

または、シグナルNを使用して、不十分なコンパイラの必要に応じて、戻り値の型 (およびすべての引数の型) を明示的に指定します。

typedef boost::signal0<void> PreUpdateSignal;
typedef boost::signal0<void> PostUpdateSignal;
于 2011-09-22T03:34:47.770 に答える