Сегодня я столкнулся с двумя сообщениями об ошибках, которых я никогда не видел прежде Это совершенно ново для меня.
Вот код:
template<typename T>
struct adder { adder(const T &item) { } };
template<typename T>
void initializer(const T &item) { adder<T>(item); }
int main()
{
initializer("const string literal");
}
При компиляции GCC выдает следующие ошибки:
prog.cpp: в функции «void initializer (const T &)»:
prog.cpp: 6: ошибка: объявление ‘сумматора элемент’ затеняет параметр
prog.cpp: В функции initial void initializer (const T &) [with T = char [21]] ’:
prog.cpp: 10: создается здесь
prog.cpp: 6: ошибка: объявление «adder item» затеняет параметр
prog.cpp: 6: ошибка: отсутствует функция сопоставления для вызова call adder :: adder () ’
prog.cpp: 3: примечание: кандидаты: adder :: adder (const T &) [с T = char [21]]
prog.cpp: 3: note: adder :: adder (const adder &)
См. Жирный текст. Одна ошибка отображается дважды , это
ошибка: объявление 10 сумматора item ’затеняет параметр
ошибка: объявление ‘adder item ’ затеняет параметр
Что это значит? Почему он показывает дважды с разными аргументами шаблона? Первый с T
, второй с char [21]
?
EDIT: adder<T>(item)
объявляет переменную с именем item ? Но это не то, что я хотел. Я думаю, что он должен создать временный объект, передавая item в качестве аргумента конструктору.
Я хотел бы знать раздел из Стандарта, который касается этой проблемы!
Другая интересная ошибка:
ошибка: не найдена соответствующая функция для вызова ‘adder :: adder ()’
Что указывает на то, что компилятор ищет конструктор по умолчанию ? Но мне интересно, почему компилятор ищет его, когда фактически мой код не использует его в строке 6 ?
Код в ideone: http://www.ideone.com/jrdLL