C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 15:29
Оценка:
При компиляции шаблонов попытка обратиться к имени шаблона класса, вложенного в класс, являющийся параметром шаблона, вызывает ошибку компиляции.

class A
{
public:
    template<
        class B >
    class C
    {};
};

template<
    class B,
    class AA >
class E
{
public:
    typedef AA::template C< B > C; // Internal compiler error
};

...
E< X, A >::C
...
Re: C1001 - любовь навеки.
От: PM  
Дата: 14.04.03 15:44
Оценка:
Здравствуйте, Анoним, Вы писали:

А>При компиляции шаблонов попытка обратиться к имени шаблона класса, вложенного в класс, являющийся параметром шаблона, вызывает ошибку компиляции.


VC7.0 скомпилял
попробуй добавить typename и/или поменять имя мембера с C на более другое

А>
А>template<
А>    class B,
А>    class AA >
А>class E
А>{
А>public:
А>    typedef typename AA::template C< B > C_instance_name; // Internal compiler error
          
А>};

А>
... << RSDN@Home 1.0 beta 6a >>
Re[2]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 15:47
Оценка:
Здравствуйте, PM, Вы писали:

PM>VC7.0 скомпилял


Я забыл указать: работаю с VC 6, изменить ему я не могу.

PM>попробуй добавить typename и/или поменять имя мембера с C на более другое


Варианты с добавлением/удалением template и typename опробовались, но не дали результата. Имя не существенно, было уяснено, что такая ошибка возникает при всякой попытке обращения к имени вложенного шаблона, не обязательно в typedef.
Re: C1001 - любовь навеки.
От: ilnar Россия  
Дата: 14.04.03 15:59
Оценка:
Здравствуйте, Анoним, Вы писали:

    typedef typename AA::template C< B > C;

так g++ понимает, а визуальник всегда лажался
Re[3]: C1001 - любовь навеки.
От: PM  
Дата: 14.04.03 16:05
Оценка:
Здравствуйте, Анoним, Вы писали:

А>Здравствуйте, PM, Вы писали:


PM>>VC7.0 скомпилял


А>Я забыл указать: работаю с VC 6, изменить ему я не могу.

Скорее всего на компиляцию шаблонов памяи не хватате, попробуй опцию /Zm2000
/Zmnumber
where: number  A scaling factor that determines the compiler's memory allocation limit.


Почитай здесь
Автор: Gurulev Dmitry
Дата: 21.11.01

Не поможет, иди сюда
... << RSDN@Home 1.0 beta 6a >>
Re[3]: C1001 - любовь навеки.
От: WolfHound  
Дата: 14.04.03 16:07
Оценка:
Здравствуйте, Анoним, Вы писали:

А>Я забыл указать: работаю с VC 6, изменить ему я не могу.

Сочувствую. Меня VC7.0 уже не устраивает... жду VC7.1 говорят там много пофиксили.
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 16:09
Оценка:
Здравствуйте, PM, Вы писали:

А>Я забыл указать: работаю с VC 6, изменить ему я не могу.

PM>Скорее всего на компиляцию шаблонов памяи не хватате, попробуй опцию /Zm2000

Во-первых, я и так компилирую всегда с опцией /Zm1500 (если верить документации, это 15*105 = 1575 Мб максимум).
Во-вторых, я думаю, что даже 105 Мб для таких шаблонов — жирно.

PM>Не поможет, иди сюда


Тут я бывал.
Re[5]: C1001 - любовь навеки.
От: PM  
Дата: 14.04.03 16:19
Оценка:
Здравствуйте, Анoним, Вы писали:

А>Здравствуйте, PM, Вы писали:


А>>Я забыл указать: работаю с VC 6, изменить ему я не могу.

PM>>Скорее всего на компиляцию шаблонов памяи не хватате, попробуй опцию /Zm2000

А>Во-первых, я и так компилирую всегда с опцией /Zm1500 (если верить документации, это 15*105 = 1575 Мб максимум).

А>Во-вторых, я думаю, что даже 105 Мб для таких шаблонов — жирно.

PM>>Не поможет, иди сюда


А>Тут я бывал.


Это судьба, меняй компилер
... << RSDN@Home 1.0 beta 6a >>
Re[6]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 16:24
Оценка:
Здравствуйте, PM, Вы писали:

PM>Это судьба, меняй компилер


Это невозможно .
Меня интересуют если не способы заставить компилятор скомпилировать это, то хоть, по крайней мере, предложения способов с минимальными потерями реорганизовать код, использующий такого рода идиомы.
Re: C1001 - любовь навеки.
От: Аноним  
Дата: 14.04.03 16:38
Оценка: 8 (2)
Здравствуйте, Анoним, Вы писали:

<skip>

Попробуй такой трюк :

template<
    class B,
    class AA,
    class DUMMY_=AA::C<B>
>
struct E {
    typedef DUMMY_ С // yeah, yeah
};


PS. Не надо вставлять слово typename (которое должно быть), VC6 не поймёт.
Re[7]: C1001 - любовь навеки.
От: ssm Россия  
Дата: 14.04.03 16:40
Оценка: +1
Здравствуйте, Анoним, Вы писали:

А>Здравствуйте, PM, Вы писали:


PM>Это судьба, меняй компилер


А>Это невозможно .

А>Меня интересуют если не способы заставить компилятор скомпилировать это, то хоть, по крайней мере, предложения способов с минимальными потерями реорганизовать код, использующий такого рода идиомы.

Можно вынести параметр вложенного параметра наверх:


template<typename T>
class A{
public:    
    class C
    {
    };
};

template<
    typename B,    
    typename AA>
class E
{
public:
    typedef AA::C C;
};


int main(int argc, char* argv[])
{
    E< X, A<X> >::C c;
}



Из той же серии, но покрасивше, но только если А параметризуется одним типом B:


template<typename T>
class A{
public:    
    typedef T B;
    class C
    {
    };
};

template<typename AA>
class E
{
public:
    typedef AA::C C;
    typedef AA::B B;
};


int main(int argc, char* argv[])
{
    

    E< A<int> >::C c;

        return 0;
}



Вообще напридумывать можно много всего, чего ты хочешь конкретно?
Re[2]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 16:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>template<
А>    class B,
А>    class AA,
А>    class DUMMY_=AA::C<B>
>
А>struct E {
А>    typedef DUMMY_ С // yeah, yeah
А>};
А>


Уже пробовал. Получаю ошибку в выделенной строке.
Re[8]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 16:42
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Можно вынести параметр вложенного параметра наверх:


Похоже, так и нужно сделать.
Хотя семантика классов от этого изменяется.
Re[3]: C1001 - любовь навеки.
От: Аноним  
Дата: 14.04.03 16:46
Оценка:
Здравствуйте, Анoним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>
А>template<
А>    class B,
А>    class AA,
А>    class DUMMY_=AA::C<B>
>
А>struct E {
А>    typedef DUMMY_ С // yeah, yeah
А>};
А>


А>Уже пробовал. Получаю ошибку в выделенной строке.


У меня работает... Чтож, видимо это нельзя побороть.
У тебя кода много ? Может, выложишь, посмотрим ?
Re[3]: C1001 - любовь навеки.
От: ssm Россия  
Дата: 14.04.03 16:46
Оценка:
Здравствуйте, Анoним, Вы писали:

А>Уже пробовал. Получаю ошибку в выделенной строке.


Видать ты недопробывал, у меня шестерка проглотила код предложеный Анонимом....
Re[4]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 16:54
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Видать ты недопробывал, у меня шестерка проглотила код предложеный Анонимом....


Да, и вправду.
Странно, вроде только что пробовал, и была ошибка.
Re[5]: C1001 - любовь навеки.
От: ssm Россия  
Дата: 14.04.03 16:56
Оценка:
Здравствуйте, Анoним, Вы писали:


А>Да, и вправду.

А>Странно, вроде только что пробовал, и была ошибка.

Срочно, пока незабыл, ставь Анониму тройку
Re[6]: C1001 - любовь навеки.
От: Анoним  
Дата: 14.04.03 17:11
Оценка:
Здравствуйте, ssm, Вы писали:

А>Да, и вправду.

А>Странно, вроде только что пробовал, и была ошибка.

ssm>Срочно, пока незабыл, ставь Анониму тройку


Так-то оно так, да вот если шаблонов больше, и они сложнее, эта штука уже не спасает. Та же ошибка в строке

class Dummy = ...


Но уже во время специализации.
Re[7]: C1001 - любовь навеки.
От: Аноним  
Дата: 14.04.03 17:30
Оценка:
Здравствуйте, Анoним, Вы писали:

А>Так-то оно так, да вот если шаблонов больше, и они сложнее, эта штука уже не спасает. <skip>


Обычно в случае, когда ошибка начинает появляться при увеличении сложности, никакие ухищрения уже не помогут. Придётся придумать новый дизайн.
Сколько раз такое было... Не зря видать allocator::rebind не используется в STL, не умеет VC6 так, и всё тут.
Re[8]: C1001 - любовь навеки.
От: Аноним  
Дата: 14.04.03 17:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Обычно в случае, когда ошибка начинает появляться при увеличении сложности, никакие ухищрения уже не помогут. Придётся придумать новый дизайн.

А>Сколько раз такое было... Не зря видать allocator::rebind не используется в STL, не умеет VC6 так, и всё тут.

Исключив один временно ненужный #include, не имеющий к обсуждаемой теме никакого отношения, проблему удалось временно победить. Похоже, проблема была в нехватке памяти. Что делать дальше — не знаю.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.