1

私は現在、テンプレート化されたメソッドを持つテンプレート化されたクラスを持っています。ファンクターではうまく機能しますが、関数のコンパイルに問題があります。

フー。

template <typename T>
class Foo {
   public:
   // Constructor, destructor, etc...
   template <typename Func>
   void bar(T x, Func f);
};

template <typename T>
template <typename Func>
void Foo<T>::bar(T x, Func f) { /* some code here */ }

メイン.cpp

#include "Foo.h"
template <typename T>
class Functor {
    public:
    Functor() {}
    void operator()(T x) { /* ... */ }
    private:
    /* some attributes here */
};

template <typename T>
void Function(T x) { /* ... */ } 

int main() {
   Foo<int> foo;
   Functor<int> F;
   foo.bar(2, F); // No problem
   foo.bar(2, Function); // <unresolved overloaded function type>
   return 0;
}
4

1 に答える 1

3

オーバーロードされた関数の関数ポインターを取得する場合は、オーバーロード セットから必要な関数をシステムに伝える必要があります。

foo.bar(2, static_cast<void(*)(int)>(&Function);

引用されたケースでは、関数は実際にはテンプレートです。つまり、その特殊化を直接参照することもできます:

foo.bar(2, &Function<int>);
于 2012-10-17T23:09:17.943 に答える