3

プログラミングの演習として、C++ で行っているコースのすべての haskell 割り当てを実装することを試みることにしました。現在、私はこの関数を送信しようとしています:

int callme(){
    cout << "callme called" << endl;
    return 0;
}

この関数に:

template<class type1,class type2> void callfunc(type1(*f)(type2)){
    (*f)(); 
}

この呼び出しで:

int main(){
    callfunc<int,void>(callme);
}

しかし、私はエラーが発生します:

macros.cc: In function ‘int main()’:
macros.cc:45:29: error: no matching function for call to ‘callfunc(int (&)())’

何が与えますか?テンプレートなしで、まったく同じ方法で関数を引数として送信できます...変更する必要があるのは、コンパイル前に型名を適切な場所に置き換えることだけですよね?

4

1 に答える 1

1

「void」はC ++の「特殊なケース」だと思います。コンパイラは f() を f(void) に一致させることができず、他の型に置き換えてコンパイルします。私にとっては、これは単なる別の C++ マジックですが、誰かがよく知っているかもしれません。これはコンパイルされます:

int callme(int){ printf("ok int\n"); return 0; }
int callme(char){ printf("ok char\n"); return 0; }
template<class type1,class type2> void callfunc(type1(*f)(type2), type2 p) {
  (*f)(p);
}

int main() {
  callfunc<int,int>(callme, 1);
  callfunc<int,char>(callme, 1);
}
于 2013-02-01T07:39:16.543 に答える