2016-03-30 4 views
4

「C++ Templates The Complete Guide」の8.3章から抜粋したコード例を理解できません。なぜコンパイラはエラーについて言いますか?著者は、& foo < int>は2つの異なるタイプのうちの1つであると言います、なぜですか?テンプレート関数のあいまいな呼び出しを避けるには?

#include <iostream> 

template <typename T> 
void single(T x) 
{ 
    // do nothing 
} 

template <typename T> 
void foo(T t) 
{ 
    std::cout << "Value" << std::endl; 
} 

template <typename T> 
void foo(T* t) 
{ 
    std::cout << "Pointer" << std::endl; 
} 

template <typename Func, typename T> 
void apply(Func func, T x) 
{ 
    func(x); 
} 

int main() 
{ 
    apply(&foo<int>, 7); 
    int i = 0; 
    std::cin >> i; 
} 

答えて

6

機能テンプレートfooには2つのオーバーロードがあります。 foo<int>は、foo<int>(int)(最初)またはfoo<int>(int*)(2番目)のいずれかになります。

あいまいさを解決するには、関連する関数タイプにキャストできます。

I.e.

apply(static_cast<void(*)(int)>(&foo<int>), 7); 

免責事項:コードはコンパイラーによって遠くからでも見られません。

関連する問題