проблема шаблона с указателями и ссылочным аргументом

Я пытаюсь понять, почему следующий код не компилируется.

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 *»

0

Решение

Может, но это временно;)

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 больше не является временным.

3

Другие решения

Результат new Выражение является значением r, поэтому оно не может связываться с неконстантной ссылкой.

Объявите ваш шаблон как void set(T val) вместо этого, чтобы передать указатель по значению.

3

Вы не можете привязать временную ссылку к неконстантной ссылке.

Если вам нужно сохранить сигнатуру этого метода, вам нужно создать переменную и передать ее этому методу:

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
}

Если вы можете изменить сигнатуру метода, передайте параметр либо по константной ссылке, либо по значению.

1