У меня есть шаблонный шаблон, и у меня есть некоторые проблемы. У меня есть эта intruction в другом классе:Ошибка в смешении функции шаблона с аргументом по умолчанию
value.push_back(x);
Будучи Xa unsigned int
, значение шаблонного класс, который называется List<unsigned int>
и push_back этой функции:
template <class T>
void List<T>::push_back(T a=T(),int l=1){
(*this).resize((*this).size+l,a);
}
И у меня есть следующее сообщение об ошибке в CodeBlocks:
...\mp.h|86|error: no matching function for call to 'List<unsigned int>::push_back(unsigned int)'
...\mp.h|86|note: candidate is:
...\list.h|36|note: void List<T>::push_back(T, int) [with T = unsigned int]
...\list.h|36|note: candidate expects 2 arguments, 1 provided
У меня нет ideia, что делать, функция уже имеет значение по умолчанию для int, и я уже пробовал использовать 2 разных компилятора, Я действительно не хочу добавлять другой аргумент в push_back
, чтобы он стал push_back(x,1)
.
Я просто сделал то, что вы говорите, и вроде работал, я получаю другую ошибку, которую я думаю, что это не имеет отношение к этому вопросу , То, что я не могу понять, - это то, почему аргумент по умолчанию работает, не будучи также в объявлении без шаблона шаблона, и почему он может быть только в объявлении, когда он затенен шаблоном. – user2054583
Не могу сказать точно. Но проблема, по-видимому, заключалась в том, что во время вызова значение аргумента по умолчанию не было доступно компилятору (что, следовательно, не «добавило» его). Аргументы по умолчанию - это только синтаксический саунд-сайт. Это частый источник путаницы. Возможно, вы захотите пошагового шага, используя вместо этого отдельные перегрузки. – sehe
@ user2054583 Ну стандарт явно запрещает его в [dcl.fct.default]/6 "За исключением функций-членов шаблонов классов, аргументы по умолчанию в определении функции-члена, которые появляются за пределами определения класса, добавляются в набор значений по умолчанию аргументы, предоставленные объявлением функции-члена в определении класса. Аргументы по умолчанию для функции-члена шаблона класса должны быть указаны в начальном объявлении функции-члена в шаблоне класса. " Я могу только догадываться, что это нужно делать либо с помощью создания экземпляра, либо упрощения (рассмотрим специализации). – dyp