Вообще, первое решение доставляет уже чисто эстетически (опустим пока размышления о том, какой метод в какой ситуации быстрее). Хотя, именно его развите позволяет решить (просто чудовищно "изящно") проблему (слить весь сурс: два класса и неймспейс - в один файл).
Во-вторых, первое решение приводит к неразрешимой ситуации.
Код дико упрощён (написан с нуля таким образом, чтобы содержать ту же проблему что и оригинал), потому не совсем понятными могут показаться некоторые решения (разбиение на классы): будем считать, что это данность.
Класс-шаблон, вместе с ним объявлено используемое им пространство имён
ASPACE, которое прекрасно видно из
main.cpp. Пространство имён содержит перечисление (
Aenum), задающее допустимые значения индексов массива данных (в данной реализации опущен). Для обработки своих данных, класс использует другой класс -
B, который тоже пришлось параметризовать.
Код:
//A.cpp
#ifndef A_INCLUDED
#define A_INCLUDED
#include "B.cpp"
namespace ASPACE{
enum Aenum{F,FF,FFUU};
}
using namespace ASPACE;
template<class Atype>
class A{
private:
Atype X;
Aenum Y;
B<Atype> *Z;
};
#endif
Класс
B содержит некоторые методы, обрабатывающие данные класса
A.
Код:
//B.cpp
#include "A.cpp"
#ifndef B_INCLUDED
#define B_INCLUDED
template<class Btype>
class B{
private:
void F(Btype m[]);
Btype X;
};
template<class Btype>
void B<Btype>::F(Btype m[]){
this->X=m[ASPACE::FFUU];
}
#endif
В итоге получается, что определение A требует B, а определение (и т.к. это одна единица трансляции) и реализация B, хотят ASPACE, описанный в единице трансляции, содержащей A. В простом случае ситуация решается так:
Код:
class w;
class q{
w *var;
};
///
class w{
int var;
};
Тут выкрутится не удалось:
B.cpp|13|error: 'ASPACE' has not been declared|
Ну и наконец
в-третьих: какого хрена производители пилят непонятные свистелки и расширения стандарта (хотя, понятно: код потом фиг перетянешь на другой компилятор), не реализовав поддержку стандартных директив?
В-четвёртых: мне одному кажется, что поддержка шаблонов в разных компиляторах сделана так своеобразно, что выглядит как костыль?