3

テンプレート化されたクラスの破棄時に呼び出される関数オブジェクトをアタッチしようとしています。ただし、関数オブジェクトを一時的に渡すことができないようです。私が得る警告は次のとおりです(コメント行の場合xi.data = 5;):

    warning C4930: 'X<T> xi2(writer (__cdecl *)(void))': 
    prototyped function not called (was a variable definition intended?)
            with
            [
                T=int
            ]

構築されたオブジェクトを使用しようとすると、次のようなコンパイル エラーが発生します。

error C2228: left of '.data' must have class/struct/union

長いコードで申し訳ありませんが、状況を評価するにはすべてのコンポーネントを表示する必要があると思います。

template<typename T>
struct Base
{
    virtual void run( T& ){}
    virtual ~Base(){}
};

template<typename T, typename D>
struct Derived : public Base<T>
{
    virtual void run( T& t )
    {
        D d;
        d(t);
    }
};

template<typename T>
struct X
{
    template<typename R>
    X(const R& r)
    {
       std::cout << "X(R)" << std::endl;
       ptr = new Derived<T,R>(); 
    }

    X():ptr(0)
    { 
        std::cout << "X()" << std::endl; 
    }

    ~X()
    {
        if(ptr) 
        {
            ptr->run(data);
            delete ptr;
        }
        else
        {
            std::cout << "no ptr" << std::endl;
        }
    }

    Base<T>* ptr; 
    T data;
};

struct writer
{
    template<typename T>
    void operator()( const T& i )
    { 
        std::cout << "T : " << i << std::endl;
    }
};

int main()
{
    {
        writer w;
        X<int> xi2(w);
        //X<int> xi2(writer()); //This does not work!
        xi2.data = 15;       
    }

    return 0;
};

私がこれを試している理由は、関数オブジェクト自体のインスタンスをクラス内に保持することなく、関数オブジェクト型をオブジェクトに「何らかの方法で」アタッチできるようにするためです。したがって、 のオブジェクトを作成するとき、 のオブジェクトclass Xをその中に保持する必要はなくclass writer、 へのポインターのみを保持する必要があります (ここがBase<T>必要かどうかはわかりません<T>が、今のところそこにあります)。

問題は、のオブジェクトを作成してから、のように呼び出すのではなくwriter、のコンストラクターに渡す必要があるように見えることですXX<int> xi(writer();

ここで完全にばかげて明白なものを見落としている可能性があります。何か提案はありますか?

4

3 に答える 3

7

「最も厄介な解析」の問題のように見えます。試す

X<int> xi2 = X<int>(writer());

また

X<int> xi2((writer()));
于 2010-04-06T13:21:00.803 に答える
5

余分な括弧を追加してみてくださいX<int> xi2((writer()));。これにより、関数の事前宣言をコンパイラが認識しなくなります。(Scott Meyers 有効な STL 項目 6.)

于 2010-04-06T13:20:42.517 に答える
5

X<int> xi2(writer());は、それ自体が を返す xi2 という関数の宣言であり、X<int>パラメータをとらず、ライターを返す関数をパラメータとして取ります。それは「最も厄介な解析」です。

解決策は、一時的なものを避けて、行ったことを行うか、括弧を追加することです。

于 2010-04-06T13:21:31.677 に答える