2013-09-22 3 views
1

У меня есть шаблонный шаблон, и у меня есть некоторые проблемы. У меня есть эта 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).

ответ

2

Включили ли вы значение по умолчанию в объявлении ?

template <class T> 
struct List 
{ 
    void push_back(T a=T(),int l=1); 
}; 

Хороший компилятор должен был отказаться скомпилировать его, если вы не сделали (или по крайней мере предупреждал о несоответствии), но, чтобы быть уверенным.

это принято «просто» реализовать элементы шаблона в классе:

template <class T> 
struct List 
{ 
    void push_back(T a=T(),int l=1) 
    { 
     (*this).resize((*this).size+l,a); 
    } 
}; 
+0

Я просто сделал то, что вы говорите, и вроде работал, я получаю другую ошибку, которую я думаю, что это не имеет отношение к этому вопросу , То, что я не могу понять, - это то, почему аргумент по умолчанию работает, не будучи также в объявлении без шаблона шаблона, и почему он может быть только в объявлении, когда он затенен шаблоном. – user2054583

+0

Не могу сказать точно. Но проблема, по-видимому, заключалась в том, что во время вызова значение аргумента по умолчанию не было доступно компилятору (что, следовательно, не «добавило» его). Аргументы по умолчанию - это только синтаксический саунд-сайт. Это частый источник путаницы. Возможно, вы захотите пошагового шага, используя вместо этого отдельные перегрузки. – sehe

+0

@ user2054583 Ну стандарт явно запрещает его в [dcl.fct.default]/6 "За исключением функций-членов шаблонов классов, аргументы по умолчанию в определении функции-члена, которые появляются за пределами определения класса, добавляются в набор значений по умолчанию аргументы, предоставленные объявлением функции-члена в определении класса. Аргументы по умолчанию для функции-члена шаблона класса должны быть указаны в начальном объявлении функции-члена в шаблоне класса. " Я могу только догадываться, что это нужно делать либо с помощью создания экземпляра, либо упрощения (рассмотрим специализации). – dyp

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