эти методы должны быть определены в заголовочном файле
Они должны быть определены в заголовочном файле a , чтобы, если они используются, они были доступны в модуле перевода, где создается функция шаблона. Если вас беспокоит слишком большое количество шаблонов в заголовочных файлах, что замедляет компиляцию модулей перевода, которые используют Mesh, но на самом деле не используют эту функцию шаблона, тогда вы можете перенести реализацию в отдельный заголовочный файл. Немного усложняет жизнь клиентам, решая, включать ли заголовок класса «полный жир» или нет, но на самом деле это не сложно.
В качестве альтернативы, для этого конкретного примера вы можете определить выходной итератор для Mesh, который добавляет нормали. Тогда клиенты со своими произвольными итераторами могут сделать:
std::copy(first, last, mymesh.normalAdder());
Единственный заголовок, который им нужен с кодом шаблона в нем, - это <algorithm>
, который, возможно, уже есть.
Чтобы сделать это самостоятельно, объект, возвращаемый normalAdder()
, должен перегрузить operator++()
и operator*()
, который сам должен вернуть прокси-объект (обычно *this
), который реализует operator=(const &Vector3)
. Это добавляет к вектору нормалей. Но все это не шаблонный код, который может быть реализован в вашем файле .cpp.
Снова в этом примере normalAdder()
может просто вернуть std::back_inserter(this.normals);
, шаблон из <iterator>
.
Относительно того, нужно ли вам беспокоиться об этом - я думаю, что когда время компиляции идет ввысь, это происходит чаще из-за ненужных зависимостей, а не из-за небольших кусочков кода шаблона в заголовках. Некоторые крупные проекты, похоже, нуждаются в решительных мерах, но лично я не работал с чем-то более 100 файлами или около того.