Как специализировать не встроенную функцию-член?(для использования в разных единицах перевода) - PullRequest
3 голосов
/ 10 января 2012

Контекст

Мы разрабатываем системный класс параметров настройки, который будет частью API, который мы предоставляем пользователям различных архитектур (меньше слов: мы не должны полагаться на поведение, специфичное для компилятора)

Обобщенный код будет выглядеть так:

В заголовке

namespace Firm
{

// Class definition
class A
{
  template<class T>
  void foo(T* aParam);
};

// Non specialized template definition
template<class T>
void A::foo(T* aParam)
{
  //...
}

// Declaration of a specialization
template<>
void A::foo<int>(int* aParam); 

} // namespace

В файле CPP

namespace Firm
{

// Definition of the specialized member function
template<>
void A::foo<int>(int* aParam)
{
  //...
}

} // namespace

Вопросы

Все отлично работает с gcc 4.x.(т.е. различные блоки компиляции используют специализированные методы, когда это уместно.) Но я чувствую себя некомфортно, поскольку читаю следующую запись:

Видимость специализации шаблона функции C ++

ПринятоВ ответе , если я правильно понимаю, , что это ошибка , если , определение специализации шаблонного метода не отображается на сайте вызова .(Это имеет место во всех единицах компиляции, которые не являются файлом CPP, перечисленным выше, но включают заголовок)

  1. Я не могу понять, почему объявления на данном этапе недостаточно (объявление предоставляетсяпо заголовку)?

  2. Если это действительно ошибка , есть ли правильный способ определить специализацию для нее:

    • не встроенный
    • используемый в любом модуле компиляции, который включает заголовок (и ссылки с соответствующим .obj)?

1 Ответ

0 голосов
/ 10 января 2012

Поместите объявление в заголовочный файл.

Компилятору либо нужно создать экземпляр шаблона (нужно определение), либо вам нужно использовать внешние шаблоны c ++ 0x

смотрите здесь:https://stackoverflow.com/a/8131212/258418

edit @ Правило единого определения: с вами должно быть все в порядке, так как я испытал следующее поведение для шаблонов: создайте их в разных файлах o (несколько раз, много времени из-за несколькихкомпиляции), когда компоновщик входит, он удаляет дубликаты и использует один экземпляр.

также посмотрите на эту ссылку ответа / вики: https://stackoverflow.com/a/8133000/258418

edit2

для классов это работает так:

extern template class yourTemplate<int>; //tell the compiler to just use this like a funciton stub and do no instantiation. put this in the header

template class yourTemplate<int>; //instantiation, put this in a c file/object that you link with the project

для вашей функции должно работать так: // Объявление специализации в вашем внешнем шаблоне заголовка <> void A :: foo (int *апары);

//in your cpp file
template<>
void A::foo<int>(int* aParam) {
    code...
}

template class A::foo<int>(int* aParam);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...