2014-10-05 4 views
2

У меня есть шаблон класса template <typename T> class MyClass с помощью метода:C++ Ошибка: 'нет функции соответствия для вызова [класс] :: [функции]'

void add (T& item) { 
    data[indexToInsert++] = &item; // data is an array of T* 
} 

В основной:

MyClass<int> thing; 
thing.add(10); 

На во второй строке, я получаю эту ошибку:

no matching function for call to MyClass::add(int) 

Почему это происходит?

+2

Ссылки на константу, такие как 'T &', не могут связываться с rvalues ​​как '10'. Как компилятор должен принять адрес '10', так или иначе? –

ответ

5

Ваша функция-член ожидает ссылки на 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.

Смежные вопросы