У меня была шаблонная функция, которую я хотел вызвать.Это (урезанная версия) заголовка:
template <typename Item>
void print (shared_ptr<const MyContainer<Item>> stuff, ostream& out)
, который я пытался вызвать такой строкой:
print (make_shared<MyContainer<int>>(42), cerr);
Но компилятор жаловался, что не быломатч.Что меня смущает, так это то, что несоответствие const не является проблемой, потому что, если я переименую свою функцию, чтобы пропустить шаблон, он работает:
void print (shared_ptr<const MyContainer<int>> stuff, ostream& out) //matches!
С другой стороны, если я опускаю constness, шаблонная версия работает:
template <typename Item>
void print (shared_ptr<MyContainer<Item>> stuff, ostream& out) //also matches!
Но я должен быть в состоянии написать функцию над константными объектами и передать ей неконстантное значение (которое функция затем просто не изменит), верно?В самом деле, если я вернусь к неуправляемым указателям, соответствующий старый способ записи заголовка был бы
template <typename Item>
void print (const MyContainer<Item>* stuff, ostream& out)
, и действительно, тогда вызов
print (new MyContainer<int>(42), cerr); //yet another match!
еще разхорошо.
Итак, что же это за конкретный набор shared_ptr
, шаблонов и const
, который приводит к тому, что компилятор не может найти соответствующую функцию?(Запуск g ++ 8.2.1 и clang ++ 7.0.1, похоже, дают тот же результат.)