Ваша проблема с компиляцией возникает из-за того, что ваш параметр шаблона шаблона C
не соответствует объявлению std::vector
:
template<
class T,
class Allocator = std::allocator<T>
> class vector;
Как вы можетесм., std::vector
имеет два параметра шаблона, в то время как ваш C
имеет только один. Но, обратите внимание также, что второй параметр (class Allocator
) имеет аргумент типа default ,Начиная с C ++ 17, это правильно, даже так, как вы написали, так как было добавлено, что параметры шаблона шаблона соответствие не требует указания параметров для параметров с параметрами по умолчанию, такими как Allocator
,Но не все компиляторы поддерживают эту модификацию языковой спецификации - смотрите здесь, как Clang 6.0.0 отказывается откомпилировать ваш оригинальный фрагмент с включенным C ++ 17.Что касается более старых версий C ++ (или любой другой версии на сегодняшний день Clang), этот фрагмент, вероятно, является тем, к чему вы стремились:
template<template<class, class> class C, typename T, typename A>
void print(const C<T, A>& c){
for(auto& e : c)cout<<e<<endl;
}
Так как здесь вы указываете правильную сигнатуру шаблона типа (* 1025)*) вы позже создаете экземпляр print()
с помощью.
Это также будет работать, независимо от C ++ 17:
template<template<class...> class C, typename T>
void print(const C<T>& c){
for(auto& e : c)cout<<e<<endl;
}
Тем не менее, обратите внимание, что* * * * * * * *, поскольку vector<int>
уже является полностью экземпляризованным типом, эта более простая версия работает так же хорошо в заданной области действия вашего фрагмента:
template<typename T>
void print(const T& c){
for(auto& e : c)cout<<e<<endl;
}
Я изменилprint () подпись от (const C& c)
до (C& c)
, она по-прежнему не работает:
Это, вероятно, лучшая практика в этом случае, поскольку вы не изменяете c
внутри print()
,Однако это не имеет отношения к вашей ошибке.