4

メイン関数内で呼び出される場合は、push メソッドが使用されます。ただし、メイン関数の引数がポインターであっても、関数を使用しますvoid Push(const DATA_TYPE& newValue)

それはポインタを受け入れるものであるため、他のものを使用すべきではありませんか? ポインター変数がある場合、2 番目の関数の引数を変更して、2 番目の関数をオーバーライドするにはどうすればよいですか?

template<typename DATA_TYPE>   
void Push(const DATA_TYPE& newValue)
{
    //do stuff
}

template<typename DATA_TYPE> 
void Push(const DATA_TYPE *newValue)
{
    //do stuff
}
4

3 に答える 3

4

あなたの問題は一貫性にあります。

Push(p)問題は、 const 以外のオブジェクト ポインターを使用して呼び出すとP * p、最初のバージョンが DATA_TYPE=P*を設定すると正確に機能し、関数シグネチャがPush( const P* & ). 対照的に、DATA_TYPE= を使用する 2 番目のバージョンでは、型シグネチャに get をP追加する必要があります。これは、完全一致であるため、2 番目のバージョンではなく最初のバージョンが選択されることを意味します。constPush( 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 );
}
于 2013-04-02T02:40:23.610 に答える