このコンパイラ エラーを理解できません。インスタンス化するクラスは「不透明」と呼ばれるため、投稿のタイトルに 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