То, что вы пытаетесь сделать, это передать rvalue (ваше new dec_facade<int>(i)
) в качестве ссылки lvalue, что объясняет, почему оно не работает.
Если вы поддерживаете его компилятор, вы можете использовать ссылки rvalueс использованием &&
модификатора типа: (Поддержка ссылки на rvalue может быть включена путем включения поддержки C ++ 0x или C ++ 11 [частичная])
template<typename T>
void foo(T& t)
{
++t;
}
template<typename T>
void foo(T&& t)
{
++t;
}
Но это только одна часть проблемы,Что вы пытаетесь сделать, это предварительно увеличить временное значение!Это бессмысленно, так как он не будет жить после этого звонка.Ваш объект будет увеличиваться, а затем уничтожаться.
Еще одно решение - удалить &
из определения вашей функции, что позволит ему принимать любой параметр.Но это, возможно, не то, что вы хотите.