частные шаблонные функции

У меня есть класс:

C.h

class C {
private:
  template<int i>
  void Func();

  // a lot of other functions
};

C.cpp

// a lot of other functions

template<int i>
void C::Func() {
 // the implementation
}

// a lot of other functions

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

А как насчет приватных функций? Может ли кто-нибудь сказать мне, есть ли минусы в реализации функций частного шаблона в файле .cpp?


person Alek86    schedule 14.09.2011    source источник
comment
stackoverflow.com/questions/4315969/   -  person Johannes Schaub - litb    schedule 17.09.2011
comment
Хотя технически на вопрос ответили Алс и Никола, для меня это просто вызывает вопрос, почему вы вообще сделали этот шаблон участника. Не было бы намного лучше иметь это как бесплатный шаблон функции в (безымянном пространстве имен) файла cpp? Я обнаружил, что со временем я все меньше и меньше использовал закрытые функции-члены, все больше и больше прибегая к бесплатным функциям в (безымянном пространстве имен) файла реализации класса.   -  person sbi    schedule 08.11.2011


Ответы (2)


Когда шаблон функции используется таким образом, что вызывает его создание, компилятору (в какой-то момент) необходимо увидеть определение этого шаблона. Именно по этой причине шаблоны обычно реализуются внутри заголовочного файла с использованием встроенных функций.

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


Ссылка:
Стандарт C++03, § 14.7.2.4:

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

person Alok Save    schedule 14.09.2011
comment
Это не противоречиво : So as long as the above rules gets followed it is still okay to have interface and implementation separated in header and source files .. противоречит ›› And that is the reason, templates are usually implemented inside a header file using inline finctions., или я что-то пропустил? - person Nawaz; 14.09.2011
comment
@Nawaz: обновлено, чтобы ответить на ваш вопрос. Хт. - person Alok Save; 14.09.2011
comment
Это не отвечает на мой вопрос. Вы сказали, что определение может быть в файле .cpp, как? - person Nawaz; 14.09.2011
comment
@Nawaz: стандартные цитаты. Определение должно присутствовать в той же единице перевода (заголовки + исходный файл). Если функция является закрытой, функция шаблона, скорее всего, *только будет явно создана из того же исходного файла, в котором есть определение функции шаблона, которое удовлетворяет требованиям, изложенным в стандарте. - person Alok Save; 14.09.2011

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

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

person Nicola Musatti    schedule 14.09.2011