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

它可以,但这是一个临时的;)

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 回答
3

表达式的结果new是一个右值,因此它不能绑定到非常量引用。

将您的模板声明为void set(T val)按值传递指针。

于 2012-09-05T09:44:45.267 回答
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 回答