2013-09-27 40 views
1

考慮以下重載函數:爲什麼不重載函數綁定到更具體的超載?

template <class T> 
void foo(const T& v) 
{ 
    std::cout << "Generic version" << std::endl; 
} 

void foo(std::pair<const void*, std::size_t> p) 
{ 
    std::cout << "Pair version" << std::endl; 
} 

下面,我預計第二超載(當一個接受一個std::pair)被稱爲:

int main() 
{ 
    const void* buf = 0; 
    std::size_t sz = 0; 
    foo(std::make_pair(buf, sz)); 
} 

然而,這段代碼實際上調用通用版。爲什麼它沒有綁定到特別需要std::pair的過載?這是一個編譯器錯誤?我用一個很老的編譯器GCC 4.1.2

+1

「不過,這段代碼實際上調用通用版本。」 [不在鏗鏘聲++ 3.4](http://coliru.stacked-crooked.com/a/f63c920491593bdb)編譯器?版? – dyp

+0

請注意你正在使用的編譯器+版本(和我的Apple LLVM版本4.2(clang-425.0.28),報告「Pair版本」 – WhozCraig

+0

不在g ++ 4.5.2上 –

回答

3
  • 您必須聲明你的專門的功能爲模板
  • 你的專業參數類型必須遵循模板參數(即是一個const引用),以及。

嘗試

template <> 
void foo(const std::pair<const void*, std::size_t>& p) 
{ 
    ... 
} 
+1

IIRC,函數模板的顯式特化需要具有相同的參數和返回類型(作爲主模板),而且重載通常比專門化有更少的問題 – dyp

+0

但是爲什麼要這樣呢?必要嗎?這是一個編譯器錯誤嗎? – Channel72

+0

更新了更多的解釋 –

相關問題