3

クラスの関数演算子へのポインタへのキャストをオーバーロードするのに苦労しています。コードでは、私が欲しいのはこれです:

typedef int(*funcptrtype)(int);

struct castable {
   operator funcptrtype() {return NULL;}
};

を使わずにできるようにしたいですtypedef。興味があれば、これが必要です。C++11 より前のテンプレート エイリアスが利用できないためです (そのため、typedefテンプレート化されたコンテキストではこのトリックはオプションではありません...)。

私は通常、これが機能することを期待します:

operator int(*)(int)() {return NULL;}

しかし、そうではありません。コンパイラ (g++ 4.6.1) は次のように述べています。

error: ‘<invalid operator>’ declared as function returning a function

これは機能します:

int (* operator()())(int){return 0;}

しかし、実際にoperator()は関数ポインターを返すためにオーバーロードしています:)

標準は次のように述べています。

conversion-type-id は、関数型または配列型を表してはなりません

しかし、それは関数ポインタ型とは言いません (最初のコードスニペットはとにかく動作します...)。

誰も正しい構文 w/o を知っていますtypedefか?

4

1 に答える 1

3

文法はこれを許可しません: 変換演算子宣言の型はtype-idではなくtype-specifierです。typedef またはエイリアスを使用する必要があります。テンプレート コンテキストでは、通常の置換を使用します。

template<typename T>
struct something {
  typedef T (*type)(int);
};
于 2012-04-15T21:59:48.680 に答える