Я пытаюсь понять, почему следующий код не компилируется.
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 *»
Может, но это временно;)
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
больше не является временным.
Результат new
Выражение является значением r, поэтому оно не может связываться с неконстантной ссылкой.
Объявите ваш шаблон как void set(T val)
вместо этого, чтобы передать указатель по значению.
Вы не можете привязать временную ссылку к неконстантной ссылке.
Если вам нужно сохранить сигнатуру этого метода, вам нужно создать переменную и передать ее этому методу:
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
}
Если вы можете изменить сигнатуру метода, передайте параметр либо по константной ссылке, либо по значению.