2016-07-18 4 views
4

Я понимаю (here - один источник), что можно переопределить аргументы шаблона по умолчанию, если два определения не конфликтуют. Таким образом, я пытаюсь скомпилировать следующие с г ++ 5.3.1:Бесконфликтное переопределение аргумента шаблона по умолчанию

template <class = int> class A; // forward declaration 
template <class T = A<>> struct B {}; 

template <class T = int> class A {}; // "= int" here is for clarity 

int main() { return 0; } 

Компилятор жалуется:

error: redefinition of default argument for ‘class T’

Где мое понимание неправильно?

ответ

3

Вы не можете переопределить параметры шаблона по умолчанию.

Когда вы пишете template <class T = int> class A {};, вы переопределяете этот параметр по умолчанию, и именно поэтому вы получаете ошибку. Вы должны выбрать одно место для установки этого параметра по умолчанию (либо прямое объявление, либо фактическое определение).

+1

У вас может быть несколько объявлений одной и той же функции, но с разными параметрами по умолчанию (в разных пределах). – Jarod42

+0

@ Jarod42 это правильно, но тогда вы не переопределяете параметры по умолчанию, поскольку в этом контексте вам недоступны те из других областей применения! – Rerito

+1

Я имею в виду что-то вроде [этого] (https://ideone.com/71tagB). – Jarod42

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