0

次のコードがコンパイルされない理由を理解しようとしています。

class X
{
public:
    template< typename T >
    void set( T & val )
    {
    }
};

int main( int c, char *v[] )
{
    X x;

    x.set( new int( 99 ) );        // 15
}

私のsolarisコンパイラでは、次のエラーが発生します。

"x.cpp", line 15: Error: Could not find a match for X::set<X::T>(int*) needed in main(int, char**).

コンパイラがintへのポインタの参照を取得せず、型「T」を「int*」として渡さない理由を理解できません。

4

3 に答える 3

3

式の結果はnew右辺値であるため、非定数参照にバインドすることはできません。

void set(T val)代わりに、値でポインタを渡すようにテンプレートを宣言します。

于 2012-09-05T09:44:45.267 に答える
3

それは可能ですが、それは一時的なものです;)

class X
{
public:
    template< typename T >
    void set( T const & val )  // add const here
    {
    }
};

そして、それを非参照にバインドすることはできませんconst

これが機能するのと同じ理由:

class X
{
public:
    template< typename T >
    void set( T & val )
    {
    }
};
int main( int c, char *v[] )
{
    X x;
    int * y = new int( 99 );
    x.set( y );        // 15
}

ここでyは、もはや一時的なものではありません。

于 2012-09-05T09:42:52.520 に答える
1

一時的なものを非定数参照にバインドすることはできません。

そのメソッドのシグネチャを保持する必要がある場合は、変数を作成して、そのメソッドに渡す必要があります。

class X
{
public:
    template< typename T >
    void set( T & val )
    {
    }
};

int main( int c, char *v[] )
{
    X x;

    int * p = new int( 99 );
    x.set( p );        // 15
}

メソッドのシグネチャを変更できる場合は、const参照または値のいずれかでパラメータを渡します。

于 2012-09-05T09:58:19.560 に答える