Показать сообщение отдельно
Старый 22.03.2012, 01:35   #669
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Веселые картинки =)

Нажмите на изображение для увеличения
Название: Буфер обмена01.jpg
Просмотров: 2715
Размер:	120.3 Кб
ID:	16426
Вообще, первое решение доставляет уже чисто эстетически (опустим пока размышления о том, какой метод в какой ситуации быстрее). Хотя, именно его развите позволяет решить (просто чудовищно "изящно") проблему (слить весь сурс: два класса и неймспейс - в один файл).
Во-вторых, первое решение приводит к неразрешимой ситуации.
Код дико упрощён (написан с нуля таким образом, чтобы содержать ту же проблему что и оригинал), потому не совсем понятными могут показаться некоторые решения (разбиение на классы): будем считать, что это данность.
Класс-шаблон, вместе с ним объявлено используемое им пространство имён 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|

Ну и наконец в-третьих: какого хрена производители пилят непонятные свистелки и расширения стандарта (хотя, понятно: код потом фиг перетянешь на другой компилятор), не реализовав поддержку стандартных директив?
В-четвёртых: мне одному кажется, что поддержка шаблонов в разных компиляторах сделана так своеобразно, что выглядит как костыль?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
BlackDragon (22.03.2012), pax (22.03.2012), Reks888 (22.03.2012)