Так вот — если включен <set>, то если перейти на объявление set, перехожу на <set> из VC\include\set и все нормально компилируется. Там вижу такое:
// TEMPLATE CLASS settemplate<class _Kty,
class _Pr = less<_Kty>,
class _Alloc = allocator<_Kty> >
class set
: public _Tree<_Tset_traits<_Kty, _Pr, _Alloc, false> >
{ // ordered red-black tree of key values, unique keyspublic:
//..
А если не включать <set>, то программа перестает компилиться и выдается эррор такой:
Error 1 error C2976: 'std::set' : too few template arguments
и указывает на строку set<int> setInt;
А если перейти на объявление set, то перехожу на boost\detail\container_fwd.hpp, где встречаю такое:
// gcc 3.4 and greaternamespace std
{
#if !defined(BOOST_CONTAINER_FWD_BAD_DEQUE)
template <class T, class Allocator> class deque;
#endif
template <class T, class Allocator> class list;
template <class T, class Allocator> class vector;
template <class Key, class T, class Compare, class Allocator> class map;
template <class Key, class T, class Compare, class Allocator>
class multimap;
template <class Key, class Compare, class Allocator> class set;
template <class Key, class Compare, class Allocator> class multiset;
#if !defined(BOOST_CONTAINER_FWD_BAD_BITSET)
template <size_t N> class bitset;
#endif
template <class T1, class T2> struct pair;
}
Здравствуйте, XJess, Вы писали:
XJ>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?
Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, XJess, Вы писали:
XJ>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?
C>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?
А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.
Здравствуйте, k.o., Вы писали:
KO>Здравствуйте, Centaur, Вы писали:
C>>Здравствуйте, XJess, Вы писали:
XJ>>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?
C>>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?
KO>А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.
Нормальное объявление класса, что не так?
И какое еще UB? Без определения класса все равно программа не скомпилируется.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, k.o., Вы писали:
KO>>Здравствуйте, Centaur, Вы писали:
C>>>Здравствуйте, XJess, Вы писали:
XJ>>>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?
C>>>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?
KO>>А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.
Ops>Нормальное объявление класса, что не так? Ops>И какое еще UB? Без определения класса все равно программа не скомпилируется.
17.4.3.1/1
It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces
within namespace std unless otherwise specified.
boost добавил объявления шаблонных классов в пространство имён std, т.о. по стандарту получаем U.B.
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, k.o., Вы писали:
KO>> Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.
KO>It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces
KO>within namespace std unless otherwise specified.
KO>boost добавил объявления шаблонных классов в пространство имён std, т.о. по стандарту получаем U.B.
не "добавил объявления", а сделал forward-declarationсуществуюших классов.
Здравствуйте, Centaur, Вы писали:
XJ>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?
C>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?
Ну, например, строки кода добавила для создания и заполнения set, потом кто-то пришел и отвлек, а когда вернулась к коду, то думала, что <set> уже вставила, скомпилила, получила вышеуказанную ошибку. А вообще я уже не помню, как я это умудрилась обнаружить
Здравствуйте, XJess, Вы писали:
XJ>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) Объявление некого класса используют для увеличения скорости компиляции, в случае, если полное его определение не требуется.
XJ>и почему они отличаются от тех, что в VS?
Они не отличаются.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, k.o., Вы писали:
KO>>17.4.3.1/1 KO>>
KO>>It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces
KO>>within namespace std unless otherwise specified.
KO>>boost добавил объявления шаблонных классов в пространство имён std, т.о. по стандарту получаем U.B.
A>не "добавил объявления", а сделал forward-declarationсуществуюших классов.
т.е. forward declaration это не declaration? Кстати, что значит существуюших? Где в translation unit будет существовать std::set если мы не включали соответвсующий заголовок?
Здравствуйте, k.o., Вы писали:
A>>не "добавил объявления", а сделал forward-declarationсуществуюших классов.
KO>т.е. forward declaration это не declaration?
declaration, но оно уже есть в std, поэтому на "добавление" это не тянет. кажется Саттер писал, что в std можно даже свои специализации существующих шаблонов добавлять. чего говорить о невинных forward-declarations?
KO>Кстати, что значит существуюших? Где в translation unit будет существовать std::set если мы не включали соответвсующий заголовок?
в translation unit нигде. от этого std::set не исчезнет из стандартной библиотеки.
Здравствуйте, breee breee, Вы писали:
BB>Здравствуйте, k.o., Вы писали:
A>>>не "добавил объявления", а сделал forward-declarationсуществуюших классов.
KO>>т.е. forward declaration это не declaration? BB>declaration, но оно уже есть в std, поэтому на "добавление" это не тянет. кажется Саттер писал, что в std можно даже свои специализации существующих шаблонов добавлять. чего говорить о невинных forward-declarations?
Что значит "не тянет"? Это declaration, раньше его в std не было теперь оно появилось. Тебя так расстраивает, что это объявлено UB? А специализации для своих типов можно добавлять, см. тот-же 17.4.3.1/1.
Здравствуйте, k.o., Вы писали:
KO>Здравствуйте, breee breee, Вы писали:
BB>>Здравствуйте, k.o., Вы писали:
A>>>>не "добавил объявления", а сделал forward-declarationсуществуюших классов.
KO>>>т.е. forward declaration это не declaration? BB>>declaration, но оно уже есть в std, поэтому на "добавление" это не тянет. кажется Саттер писал, что в std можно даже свои специализации существующих шаблонов добавлять. чего говорить о невинных forward-declarations?
KO>Что значит "не тянет"? Это declaration, раньше его в std не было теперь оно появилось. Тебя так расстраивает, что это объявлено UB?
Что ж, возможно, формально так оно и есть, не буду спорить. Но это больше похоже на недосмотр, нежели осознанное ограничение. Кроме того, в контексте данной темы никакого вреда оно не приносит.
C>>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>? KO>А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.
Сообщение об ошибке оно не портит. Вот полный текст ошибке к данной строке, на VS2010:
test.cpp(16): error C2976: 'std::set' : too few template arguments
: see declaration of 'std::set'
test.cpp(16): error C2079: 'setInt' uses undefined class 'std::set'
KO>А специализации для своих типов можно добавлять, см. тот-же 17.4.3.1/1.
Не своих, а стандартных
Здравствуйте, k.o., Вы писали:
KO>Где в translation unit будет существовать std::set если мы не включали соответвсующий заголовок?
выучите сначала С++, толстый вы наш
Здравствуйте, breee breee, Вы писали:
BB>Здравствуйте, k.o., Вы писали:
KO>>Здравствуйте, breee breee, Вы писали:
BB>>>Здравствуйте, k.o., Вы писали:
A>>>>>не "добавил объявления", а сделал forward-declarationсуществуюших классов.
KO>>>>т.е. forward declaration это не declaration? BB>>>declaration, но оно уже есть в std, поэтому на "добавление" это не тянет. кажется Саттер писал, что в std можно даже свои специализации существующих шаблонов добавлять. чего говорить о невинных forward-declarations?
KO>>Что значит "не тянет"? Это declaration, раньше его в std не было теперь оно появилось. Тебя так расстраивает, что это объявлено UB? BB>Что ж, возможно, формально так оно и есть, не буду спорить. Но это больше похоже на недосмотр, нежели осознанное ограничение. Кроме того, в контексте данной темы никакого вреда оно не приносит.
UB это и есть формальность, никто не обещал, что оно обязательно приведёт к форматированию диска. На недосмотр это непохоже, реализации стандартной библиотеки имеют право добавлять дополнительные шаблонные параметры, поэтому написать полностью переносимую forward declaration не получится.
C>>>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>? KO>>А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB. BB>Сообщение об ошибке оно не портит. Вот полный текст ошибке к данной строке, на VS2010:
BB>
BB>test.cpp(16): error C2976: 'std::set' : too few template arguments
BB>: see declaration of 'std::set'
BB>test.cpp(16): error C2079: 'setInt' uses undefined class 'std::set'
да, тогда всё не так страшно.
KO>>А специализации для своих типов можно добавлять, см. тот-же 17.4.3.1/1. BB>Не своих, а стандартных
специализации стандартных шаблонов для своих типов.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, k.o., Вы писали:
KO>>Где в translation unit будет существовать std::set если мы не включали соответвсующий заголовок? A>выучите сначала С++, толстый вы наш
Цитирование стандарта в прикладных вопросах это троллинг?
Try to cite standard to lame
This is more than just a game.
It's real fun, but just the same,
It's trolling, trolling, trolling.
Здравствуйте, k.o., Вы писали:
KO>...реализации стандартной библиотеки имеют право добавлять дополнительные шаблонные параметры, поэтому написать полностью переносимую forward declaration не получится.
Можешь подвердить это? Где конкретно в стандарте указана возможноть такого добавления?