При компиляции шаблонов попытка обратиться к имени шаблона класса, вложенного в класс, являющийся параметром шаблона, вызывает ошибку компиляции.
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
...
Здравствуйте, Анoним, Вы писали:
А>При компиляции шаблонов попытка обратиться к имени шаблона класса, вложенного в класс, являющийся параметром шаблона, вызывает ошибку компиляции.
VC7.0 скомпилял
попробуй добавить typename и/или поменять имя мембера с C на более другое
А>
А>template<
А> class B,
А> class AA >
А>class E
А>{
А>public:
А> typedeftypename AA::template C< B > C_instance_name; // Internal compiler error
А>};
А>
Я забыл указать: работаю с VC 6, изменить ему я не могу.
PM>попробуй добавить typename и/или поменять имя мембера с C на более другое
Варианты с добавлением/удалением template и typename опробовались, но не дали результата. Имя не существенно, было уяснено, что такая ошибка возникает при всякой попытке обращения к имени вложенного шаблона, не обязательно в typedef.
Здравствуйте, Анoним, Вы писали:
А>Здравствуйте, PM, Вы писали:
PM>>VC7.0 скомпилял
А>Я забыл указать: работаю с VC 6, изменить ему я не могу.
Скорее всего на компиляцию шаблонов памяи не хватате, попробуй опцию /Zm2000
/Zmnumber
where: number A scaling factor that determines the compiler's memory allocation limit.
Здравствуйте, Анoним, Вы писали:
А>Я забыл указать: работаю с VC 6, изменить ему я не могу.
Сочувствую. Меня VC7.0 уже не устраивает... жду VC7.1 говорят там много пофиксили.
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, PM, Вы писали:
А>Я забыл указать: работаю с VC 6, изменить ему я не могу. PM>Скорее всего на компиляцию шаблонов памяи не хватате, попробуй опцию /Zm2000
Во-первых, я и так компилирую всегда с опцией /Zm1500 (если верить документации, это 15*105 = 1575 Мб максимум).
Во-вторых, я думаю, что даже 105 Мб для таких шаблонов — жирно.
PM>Не поможет, иди сюда
Здравствуйте, Анoним, Вы писали:
А>Здравствуйте, PM, Вы писали:
А>>Я забыл указать: работаю с VC 6, изменить ему я не могу. PM>>Скорее всего на компиляцию шаблонов памяи не хватате, попробуй опцию /Zm2000
А>Во-первых, я и так компилирую всегда с опцией /Zm1500 (если верить документации, это 15*105 = 1575 Мб максимум). А>Во-вторых, я думаю, что даже 105 Мб для таких шаблонов — жирно.
PM>>Не поможет, иди сюда
А>Тут я бывал.
Здравствуйте, PM, Вы писали:
PM>Это судьба, меняй компилер
Это невозможно .
Меня интересуют если не способы заставить компилятор скомпилировать это, то хоть, по крайней мере, предложения способов с минимальными потерями реорганизовать код, использующий такого рода идиомы.
Здравствуйте, Ан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;
}
Вообще напридумывать можно много всего, чего ты хочешь конкретно?
Здравствуйте, 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, не имеющий к обсуждаемой теме никакого отношения, проблему удалось временно победить. Похоже, проблема была в нехватке памяти. Что делать дальше — не знаю.