2012-10-17 48 views
1

我目前有一個模板化類,帶有模板化方法。與函子很好地協作,但是在編譯函數時遇到了麻煩。在C++中使用模板化方法交替使用函數函數和函數指針

foo.h中

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 */ } 

Main.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; 
} 
+0

您是否有多個名爲'Function'的函數? –

+2

'void Function(T x){/ * ... * /}'不是模板,那麼T是什麼? –

+0

@JamesMcNellis編號 – blaze

回答

3

如果你想獲得一個函數指針的重載函數,你需要告訴它發揮作用了過載集的系統你想要:

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

在引用的情況下,函數實際上是一個模板,也就是說,你也可以請參閱其專業化:

foo.bar(2, &Function<int>); 
+0

謝謝,這工作正常。第二行是具體的。但是,我只是使用:foo.bar(2,函數);並工作。有什麼不同。它純粹是句法嗎? – blaze

+1

@metroxylon:'&Function '是一個函數指針,'Function '是一個函數,當它傳入'foo.bar'時,它會立即衰減爲一個函數指針。所以是的,在這種情況下,根據你的觀點,'&'是句法噪音或句法澄清。 – ildjarn

+0

@ildjarn謝謝,很高興知道。 – blaze