| Должно ли это компилироваться (вложенные private классы)? | |
| От: | Xentrax | ||
| Дата: | 29.05.08 17:09 |
Имеем вложенный закрытый класс с пользовательским оператором delete. Попытка использовать std::tr1::shared_ptr<> обламывается в VC2008 на шаблонной функции. Вот упрощенный пример:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. cl15.cpp cl15.cpp(5) : error C2248: 'A::B' : cannot access private class declared in class 'A' cl15.cpp(12) : see declaration of 'A::B' cl15.cpp(9) : see declaration of 'A' cl15.cpp(17) : see reference to function template instantiation 'void destroy<A::B>(T *)' being compiled with [ T=A::B ] Вот так вариант с shared_ptr<>
|
| Re: Должно ли это компилироваться (вложенные private классы) | |
| От: | Roman Odaisky | ||
| Дата: | 29.05.08 18:18 |
| Здравствуйте, Xentrax, Вы писали: X>Имеем вложенный закрытый класс с пользовательским оператором delete. Попытка использовать std::tr1::shared_ptr<> обламывается в VC2008 на шаблонной функции.
А ошибки всё же есть :-) X>#include <cstdlib> X> return std::malloc(size); хотя и несерьезные. status=sent (delivered to file: /dev/null) |
| Re[2]: Должно ли это компилироваться (вложенные private клас | |
| От: | Xentrax | ||
| Дата: | 29.05.08 19:31 |
| Здравствуйте, Roman Odaisky, Вы писали: RO>А ошибки всё же есть X>>#include <cstdlib> X>> return std::malloc(size); RO>хотя и несерьезные. как мы видим, компилятору Comeau доверять нельзя. Я ведь к нему сразу и пошел, но он спокойно скомпилировал. Теперь для забивания бага в MS Connect хотелось бы понять откуда следует, что у функции destroy<> есть доступ к ~B() |
| Re[2]: Должно ли это компилироваться (вложенные private клас | |
| От: | Bell | ||
| Дата: | 29.05.08 19:35 | ||
| Оценка: | 4 (1) | ||
| Здравствуйте, Roman Odaisky, Вы писали: RO>
А чем Комо руководствуется в данном случае? Почему можно явно инстанциировать destroy для A::B:
но нельзя специализировать?
Кстати вот еще интересный момент:
Любите книгу — источник знаний (с) М.Горький |
| Re: Должно ли это компилироваться (вложенные private классы) | |
| От: | Bell | ||
| Дата: | 29.05.08 20:02 |
| Здравствуйте, Xentrax, Вы писали: VC7.1 тоже не компилит. Хотел предложить тебе сделать std::tr1::destroy<A::B> другом A, но мой VC7.1 и это не съел:
Вот более простой вариант с этой же проблемой:
Зато компилится вот такой вот вариант:
Любите книгу — источник знаний (с) М.Горький |
| Re[2]: Должно ли это компилироваться (вложенные private клас | |
| От: | Xentrax | ||
| Дата: | 29.05.08 20:58 |
| Здравствуйте, Bell, Вы писали: У нас импользуется порезаный shared_ptr, без deleter'ов. Дело в том, что в бусте пользовательские функции удаления реализованы через класс с виртуальными функциями, а вируальные функции в шаблонах не совместимы с выгрузкой DLL из памяти (FreeLibrary). Я задавал вопрос по этому поводу в c++.moderated, там меня послали, сказав, что это баг в реализации. Я другого способа реализовать shared_ptr в обычном компиляторе не вижу, поэтому на мой взгляд это у них самих баг в реализации. Но, конечно, скопировать и перекроить исходники shared_ptr никто не запрещает. B>VC7.1 тоже не компилит. B>Хотел предложить тебе сделать std::tr1::destroy<A::B> другом A, но мой VC7.1 и это не съел: Workaround для 8.0 и 9.0 мы еще вчера (уже даже позавчера) нашли. Работает вот так
Правда выдает дикий ворнинг 4-го уровня warning C4396: 'sp::destroy' : the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
|
| Re[3]: Должно ли это компилироваться (вложенные private клас | |
| От: | Bell | ||
| Дата: | 30.05.08 05:19 |
| Здравствуйте, Xentrax, Вы писали: X>Правда выдает дикий ворнинг 4-го уровня X>warning C4396: 'sp::destroy' : the inline specifier cannot be used when a friend declaration refers to a specialization of a function template Попробуй убрать inline из определения sp::destroy — для шаблонов он все равно особой нагрузки не несет... Любите книгу — источник знаний (с) М.Горький |