Когда я специализирую (статическую) функцию-член / константу в шаблонном классе, я не понимаю, куда должно идти объявление.
Вот пример того, что я должен делать - вы обратились непосредственно от Справка IBM по специализации шаблонов :
=== Пример специализации члена IBM ===
template<class T> class X {
public:
static T v;
static void f(T);
};
template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }
template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }
int main() {
X<char*> a, b;
X<float> c;
c.f(10); // X<float>::v now set to 20
}
Вопрос в том, как разделить это на файлы header / cpp?Обобщенная реализация, очевидно, находится в заголовке, но как насчет специализации?
Он не может войти в заголовочный файл, потому что он конкретный, что приводит к множественному определению.Но если он входит в файл .cpp, является ли код, вызывающий X :: f (), осведомленным о специализации, или он может полагаться на универсальный X :: f ()?
Пока чтополучил специализацию только в .cpp, без объявления в заголовке.У меня нет проблем с компиляцией или даже выполнением моего кода (на gcc, не помню версию на данный момент), и он ведет себя как ожидалось - с учетом специализации.Но А) Я не уверен, что это правильно, и я хотел бы знать, что есть, и Б) моя документация по Doxygen выходит шаткой и очень вводящей в заблуждение (подробнее об этом в мгновение более поздний вопрос).
Что мне кажется наиболее естественным, так это то, что объявление специализации в заголовке и определение его в .cpp:
=== XClass.hpp === *
#ifndef XCLASS_HPP
#define XCLASS_HPP
template<class T> class X {
public:
static T v;
static void f(T);
};
template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }
/* declaration of specialized functions */
template<> char* X<char*>::v;
template<> void X<float>::f(float arg);
#endif
=== XClass.cpp ===
#include <XClass.hpp>
/* concrete implementation of specialized functions */
template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }
... но я понятия не имею, верно ли это.Есть идеи?