0

の1つまたは2つの引数をデリゲートと呼ぶことができるC++の「イベント」クラスを使用しています。

最近、引数を必要としないデリゲートのサポートを追加しましたが、テンプレート引数を使用しないようにクラスを特殊化する場合でも、クラス定義の後に<>を追加する必要があります。

1つまたは2つの引数を使用した使用例:

class Example 
{
public:
    event<int> SingleArgEvent;
    event<int, int> DoubleArgEvent;
};

そしてここに引数なしの例:

class Example 
{
public:
    event<> NoArgTest1; // compiles just fine
    event NoArgTest2;   // gives me C2955: 'event' : use of class template requires template argument list
};

角かっこで動作するので、角かっこが必要な理由がわかりません。クラス特殊化コードは次のとおりです。

class null_typelist {};
/** event template **/
template <class Targ1 = null_typelist, class Targ2 = null_typelist>
class event : public event2_base<Targ1, Targ2>
{
};

template <class Targ>
class event<Targ, null_typelist> : public event1_base<Targ>
{
};

template <>
class event<null_typelist, null_typelist> : public event0_base
{
};
4

2 に答える 2

3

引数なしで関数fooを呼び出したい場合は、foo()だけでなく書く必要がありますfoo。これは、テンプレートタイプの場合もまったく同じです。eventは型ではなく、型を取り、型を返す「関数」です。角かっこを書きたくない場合でも、次のようなことができます。

typedef event<> event_;
于 2010-09-14T08:55:23.500 に答える
3

C ++の文法ではそう言われているので、角かっこが必要です。

14.2 / 1(temp.names / 1)では、<と>はオプションではありませんが、template-argument-listはオプションです。したがって、event <>は有効なテンプレートIDですが、eventは<>の欠如によるものではありません。

template-id:
           template-name  < template-argument-list opt >
于 2010-09-14T09:10:11.313 に答える