2014-11-12 2 views
-2

Если в час файла, есть функция:C++ передать указателем, декларация по умолчанию

void printDictionary(Dict *dic, WordType type=ALL){ 
} 

И в соответствующем файле CPP, есть функция:

void printDictionary(Dict *dic, WordType type){ 
} 

Будет ли любая ошибка компиляции? Или просто правильные соответствующие функции?

ответ

5

Ошибка есть, так как оба имеют тело функции; вы дважды определили одну и ту же функцию, нарушив правило определения.

Объявить функцию в заголовке

void printDictionary(Dict *dic, WordType type=ALL); 
               ^not {} 

и определить его в исходном файле, как вы делали.

Аргументы по умолчанию должны идти по объявлению в заголовке, так как они необходимы для вызова функции, использующей их. Они также не могут использовать определение, поэтому ваше определение правильное.

+0

Фактически значение аргумента по умолчанию может идти в исходном файле, но только вызовы, которые могут его увидеть, позволят это, поэтому это не очень полезно. –

+0

@NeilKirk: Действительно, я должен был сказать «должен» не «должен». Исправленный. –

+0

так хорошо, что в h: void printDictionary (Dict * dic, тип WordType); И в соответствующем файле cpp: void printDictionary (Dict * dic, Тип WordType = ALL) {} ?? – tcloaa