這是因爲const DATA_TYPE& newValue
將匹配相當多的東西,在你的情況下,它作爲參考指針const DATA_TYPE*& newValue
匹配。嘗試使用std::remove_pointer
described here - 從我的頭頂,我會寫:
template<typename DATA_TYPE>
void Push(const typename std::remove_pointer<DATA_TYPE>::type& newValue)
{
//do stuff
}
template<typename DATA_TYPE>
void Push(const DATA_TYPE *newValue)
{
//do stuff
}
Nothe然而,寫作模板匹配const T&
與其他模板重載沿通常會導致const T&
搶每一個電話,所以你應該避免做這樣。
編輯:
我以前的代碼是不正確的,它必須是有點複雜:
#include <iostream>
#include <type_traits>
template<typename DATA_TYPE, bool is_pointer>
struct helper;
template<typename DATA_TYPE>
struct helper<DATA_TYPE, true>{
static void f(const typename std::remove_pointer<DATA_TYPE>::type*){
std::cout << "Pointer" << std::endl;
}
};
template<typename DATA_TYPE>
struct helper<DATA_TYPE, false>{
static void f(const DATA_TYPE&){
std::cout << "Non-pointer" << std::endl;
}
};
template<typename DATA_TYPE>
void Push(const DATA_TYPE& newValue)
{
helper<DATA_TYPE, std::is_pointer<DATA_TYPE>::value >::f(newValue);
}
int main()
{
int i=0;
Push(i);
Push(&i);
return 0;
}
這工作正常,並沒有強制呼叫者使用適當的常量-ness,雖然我承認它並不像我以前的解決方案那樣光鮮;)
看看http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/ Stephan-T-Lavavej-Core-Cpp-3-of-n一切都很好解釋。 –