Ваша функция-член ожидает ссылки на T
, которая будет int&
. Вы передаете простой int
, а не переменную типа int
, из которой C++ может взять ссылку. Это недопустимо: вы можете передать int
вместо постоянной ссылки, но не вместо постоянной ссылки.
Причина в том, что, когда вы передаете значение вместо постоянной ссылки, C++ может создать временный объект, скопировать значение в него и передать ссылку на это временное значение для функции. Выполнение этого же для непостоянной ссылки было бы неверным, потому что ваш код не имеет доступа к потенциально изменяемому временному объекту.
Ваш код иллюстрирует причину, почему это было бы неправильно: вы передаете 10
вашей функции, но функция принимает адрес item
. Каков адрес 10
? C++ не знает, потому что целочисленный литерал 10
не имеет адреса.
можно зафиксировать вызов, обеспечивая переменную типа int
, установив его на 10
, и призывая add
:
MyClass<int> thing;
int ten = 10;
thing.add(ten);
Однако, вы должны убедиться, что thing
не будет иметь более широкий охват, чем ten
, потому что в противном случае вы получите «обвисший указатель» внутри массива data
объекта thing
.
Ссылки на константу, такие как 'T &', не могут связываться с rvalues как '10'. Как компилятор должен принять адрес '10', так или иначе? –