2

このコンパイラ エラーを理解できません。インスタンス化するクラスは「不透明」と呼ばれるため、投稿のタイトルに class(*)() と書きましたが、その名前は有益でも関連性もありません。これは、テンプレート化された循環バッファーといくつかのテストです。不透明なクラスを使用して、完全なクラス/構造体型でデータ構造をテストしています。また、プリミティブ (現時点では int) を使用してテストしていますが、そのテスト関数ではこのコンパイラ エラーは発生しません。これよりも多くのコードがありますが、関連するセクションと思われるものを提供しました。興味がある場合は、完全なコードがここにあります。

gcc エラー:

tests.cpp: In function ‘bool opaque_fill_test(int)’:
tests.cpp:97:23: error: no matching function for call to ‘CircBuf<opaque>::remove(opaque (*)())’

tests.cpp:

struct opaque {
  int id;
  opaque(int n): id(n) {} 
  opaque operator=(const opaque &o) { this->id = o.id; }
};

opaque rcv();
CircBuf<opaque> c(size);
for (int i=0; i<size; i++) {
    if ( c.remove(&rcv)) {
        if (rcv.id != i ) {
            cout << "wrong value: " << rcv << " "
            << "should be: " << i << endl;
            return false;
        }
    } else {
        cout << "remove fail at i=" << rcv << endl;
        return false;
    }
}

CircBuf.h:

template<typename T> class CircBuf {
    ...
    template<typename T> bool CircBuf<T>::remove(T *t) {
       ...
       *t = data[front];
       ...

opaque* を宣言し、それを渡して代わりに削除すると:

opaque rcv();
opaque* p = &rcv;
for (int i=0; i<size; i++) {
  if ( c.remove(p)) {
    ...
    ...

同様のエラーが表示されます:

tests.cpp: In function ‘bool opaque_fill_test(int)’:
tests.cpp:96:16: error: cannot convert ‘opaque (*)()’ to ‘opaque*’ in initialization
4

3 に答える 3

1

宣言がある場合foo x();、式&xは実際には のようなものに代入可能な関数ポインタになりますfoo *(y)()。最後の例のp変数は、そのような関数ポインターではなく、単にopaque構造体へのポインターです。したがって、関数ポインターをその変数に割り当てることはできません。

[編集] 覚えておいてください:opaque変数を宣言し、デフォルトのコンストラクターを使用して初期化するつもりだったのかもしれません。その場合、括弧を省略します。これは、C の残りの構文です。別のコンストラクターを呼び出すために実際に間に値を入れた場合にのみ、括弧を使用できます。

于 2012-07-29T07:42:54.627 に答える
1

あなたがしていること:

opaque rcv();

rcv戻り値の型を持ち、opaque引数を取らない名前で「関数を宣言」していることです。このリンクを確認してください

括弧を削除します。

opaque rcv;
于 2012-07-29T07:48:14.767 に答える
0

あなたは最も厄介な parseをヒットしました。

opaque* を宣言し、それを渡して代わりに削除すると:

opaque rcv();

opaqueこれは、デフォルトで初期化された ではなく、 を返す関数を宣言しますopaque。代わりにopaque rcv;またはを使用しますopaque rcv = {};

エラーメッセージopaque (*)()は、 を返す関数へのポインタの型ですopaque。「関数」の名前は、呼び出し以外に使用されると、暗黙的にポインターに変換されました。

于 2012-07-29T07:56:07.530 に答える