6

C++ でテンプレート関数ポインターを宣言しようとしています。

template <class T>
class MyClass
{
public:
    typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);
};

しかし、何らかの理由でこのエラーが発生し続けます:

'T': '::' が続く場合、クラスまたは名前空間でなければなりません

誰かが私が間違っていることを教えてもらえますか?
コンパイラは T がクラスであることを認識している必要があります。MyClass宣言の上にそう書いてあります...

4

5 に答える 5

2

では、メンバー ポインターを持つことができるのはクラス型のみであるため、クラス型であるT::*MyTemplatedEventことが期待されます。Tこれは、クラス以外の型、たとえばintorを渡すchar*と、指定されたエラーが発生することを意味します。これらの型にはメンバーがなく、逆にメンバー ポインターもないためです。

コンパイラは T がクラスであることを認識している必要があります。MyClass宣言の上にそう書いてあります...

違う。class Tテンプレート パラメーターと同じであり、後でテンプレート引数として渡される任意の型のプレースホルダーであるtypename Tことをコンパイラーに通知するだけです。型がクラス型であることを制限しません。T

于 2012-09-26T19:08:27.760 に答える
1

これは、コンパイラーが持つことができないポインターまたはプリミティブであり、それらに関連付けられた関数ポインターであるテンプレートの「MyClass」を作成しようとしたためだと思います...

于 2012-06-02T15:22:37.130 に答える
0

最初に、MyClass の定義では、クラスを次のように宣言する 2 つの方法があることに注意してください。

template< class T > class MyClass

template< typename T > class MyClass

は同等ですが、一方のキーワードを他方のキーワードよりも優先して使用することで、コンパイラにより多くの情報を提供することはありません。

それを超えて、コンパイラは正しいと思います.MyClass < int >は、C ++でint::somethingを書くことができないため機能しませんが、たとえばMyClass < std::string >は完全にうまく機能します.

于 2012-09-23T14:53:13.263 に答える
-1

C++ でテンプレート関数ポインターを使用できるとは思わないので、このリンク C++, function pointer to the template function pointer を確認してください。

"typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);" ここで、T はテンプレート パラメーターであり、名前空間やクラス型ではありません。T はデータ型であり、ユーザー定義または int や char などの基本的なデータ型にすることができますが、名前空間やクラスではないため、コンパイル エラーが発生します。これは正しいです。

于 2012-09-24T09:25:16.587 に答える
-1

次のことを試してください。

typedef T type;
typedef const unsigned char* (type::*MyTemplatedEvent)(unsigned long &myParameter);
于 2012-06-02T14:32:06.007 に答える