1

このコードをコンパイルしようとすると、Visual Studio 2012 で次のコンパイラ エラーが発生します。

error C2440: 'default argument' : cannot convert 'void(_cdecl*)(void)' to 'void(_cdecl*)(void)'

私のコード:

namespace bar {
    template<typename T> void foo();
    template<> void foo<int>() {}
}

struct A {
    void(*f)();

    template<typename T> inline void set_func(void(*f)()=bar::foo<T>) {this->f=f;}
};

int main(void) {
    A a;
    a.set_func<int>();
    return 0;
}

グローバル名前空間に移動bar::fooすると、エラーが発生しなくなりました。誰でも説明できますか?

上記のコードを編集して、メンバー関数とテンプレートの特殊化に関する混乱を取り除きました。typedef も削除しました。これにより、同じエラーのさらに奇妙なバージョンが発生します。cannot convert 'void(_cdecl*)(void)' to 'void(_cdecl*)(void)'

4

2 に答える 2

0

これは明らかにコンパイラ自体のバグであるため、私にできることは、同じ効果を達成するための回避策を作成することだけです。

デフォルトの引数を削除し、オーバーロードされたメソッドを次のように使用しました。

template<typename T> inline void set_func() {this->f=bar::foo<T>;}
template<typename T> inline void set_func(void(*f)()) {this->f=f;}
于 2014-03-13T03:23:28.157 に答える