Контекст
Мы разрабатываем системный класс параметров настройки, который будет частью 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, перечисленным выше, но включают заголовок)
Я не могу понять, почему объявления на данном этапе недостаточно (объявление предоставляетсяпо заголовку)?
Если это действительно ошибка , есть ли правильный способ определить специализацию для нее:
- не встроенный
- используемый в любом модуле компиляции, который включает заголовок (и ссылки с соответствующим .obj)?