あなたの問題は一貫性にあります。
Push(p)
問題は、 const 以外のオブジェクト ポインターを使用して呼び出すとP * p
、最初のバージョンが DATA_TYPE=P*
を設定すると正確に機能し、関数シグネチャがPush( const P* & )
. 対照的に、DATA_TYPE= を使用する 2 番目のバージョンでは、型シグネチャに get をP
追加する必要があります。これは、完全一致であるため、2 番目のバージョンではなく最初のバージョンが選択されることを意味します。const
Push( const P* )
何が起こっているのかを明確にするための例を次に示します。
次に例を示します。
#include <iostream>
class Foo
{
public:
template<typename DT>
void Push(const DT& newValue)
{
std::cout<<"In const DT& version"<<std::endl;
}
template<typename DT>
void Push(const DT *newValue)
{
std::cout<<"In const DT* version"<<std::endl;
}
};
int main()
{
Foo f;
int i=7;
// Since i is not const we pickup the wrong version
f.Push( i ); // const DT& ( DT = int )
f.Push( &i ); // const DT& ( DT = int* )
// Here's using a const pointer to show it does the right things
const int * const_i_ptr = &i;
f.Push( const_i_ptr ); // const DT* ( DT = int );
// Now using a const object everything behaves as expected
const int i_const = 7;
f.Push( i_const ); // const DT& ( DT = int );
f.Push( &i_const ); // const DT* (DT = int );
}