[MSVC] Вопрос про boost
От: XJess  
Дата: 27.05.11 07:45
Оценка:
Привет всем!
Делала один тестовый маленький консольный проектик в MSVC 2008. Там используется класс std::set, а также boost.

Есть там такие строки:

using std::set;
set<int> setInt;
setInt.insert(3);
setInt.insert(4);
setInt.insert(2);
setInt.insert(3);
setInt.insert(7);
setInt.insert(3);
setInt.insert(8);
setInt.insert(9);
//...


Так вот — если включен <set>, то если перейти на объявление set, перехожу на <set> из VC\include\set и все нормально компилируется. Там вижу такое:

// TEMPLATE CLASS set
template<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 keys
public:
//..



А если не включать <set>, то программа перестает компилиться и выдается эррор такой:

Error 1 error C2976: 'std::set' : too few template arguments


и указывает на строку set<int> setInt;

А если перейти на объявление set, то перехожу на boost\detail\container_fwd.hpp, где встречаю такое:

// gcc 3.4 and greater
namespace 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;
}



В программу включены такие хэдеры из boost:

#include <boost\lambda\lambda.hpp>
#include <boost\lambda\bind.hpp>
#include <boost\function.hpp>



Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?
Re: [MSVC] Вопрос про boost
От: Centaur Россия  
Дата: 27.05.11 07:54
Оценка: 1 (1) +2 -1 :)
Здравствуйте, XJess, Вы писали:

XJ>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?


Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?
Re[2]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 09:52
Оценка: -2
Здравствуйте, Centaur, Вы писали:

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


XJ>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?


C>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?


А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.
Re[3]: [MSVC] Вопрос про boost
От: Sni4ok  
Дата: 27.05.11 10:05
Оценка: +2
Здравствуйте, k.o., Вы писали:

KO> Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.



какая вольность? корректный forward declaration
Re[3]: [MSVC] Вопрос про boost
От: Ops Россия  
Дата: 27.05.11 10:34
Оценка:
Здравствуйте, k.o., Вы писали:

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


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


XJ>>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?


C>>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?


KO>А тебе не пришло в голову, что можно использовать std::set и при этом забыть включить заголовок <set>? Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.


Нормальное объявление класса, что не так?
И какое еще UB? Без определения класса все равно программа не скомпилируется.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 15:02
Оценка: 2 (1) +1 -1
Здравствуйте, 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.
Re[4]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 15:04
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, k.o., Вы писали:


KO>> Между прочим, подобная вольность со стороны boost не только "портит" сообщение об ошибке, но и приводит к UB.



S>какая вольность? корректный forward declaration


UB и кривое сообщение об ошибке, тебя не смущает?
Re[5]: [MSVC] Вопрос про boost
От: Abyx Россия  
Дата: 27.05.11 15:13
Оценка: +1 -1
Здравствуйте, 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.


не "добавил объявления", а сделал forward-declaration существуюших классов.
In Zen We Trust
Re[2]: [MSVC] Вопрос про boost
От: XJess  
Дата: 27.05.11 15:14
Оценка:
Здравствуйте, Centaur, Вы писали:

XJ>>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны) и почему они отличаются от тех, что в VS?


C>Это неправильный вопрос. Правильный вопрос — почему тебе пришло в голову использовать std::set и при этом не включить заголовок <set>?


Ну, например, строки кода добавила для создания и заполнения set, потом кто-то пришел и отвлек, а когда вернулась к коду, то думала, что <set> уже вставила, скомпилила, получила вышеуказанную ошибку. А вообще я уже не помню, как я это умудрилась обнаружить
Re: [MSVC] Вопрос про boost
От: breee breee  
Дата: 27.05.11 15:22
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Так вот — у меня вопрос — почему в boost встречаются эти объявления (зачем они там нужны)

Объявление некого класса используют для увеличения скорости компиляции, в случае, если полное его определение не требуется.

XJ>и почему они отличаются от тех, что в VS?

Они не отличаются.
Re[6]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 15:26
Оценка:
Здравствуйте, 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 если мы не включали соответвсующий заголовок?
Re[7]: [MSVC] Вопрос про boost
От: breee breee  
Дата: 27.05.11 15:34
Оценка:
Здравствуйте, k.o., Вы писали:

A>>не "добавил объявления", а сделал forward-declaration существуюших классов.


KO>т.е. forward declaration это не declaration?

declaration, но оно уже есть в std, поэтому на "добавление" это не тянет. кажется Саттер писал, что в std можно даже свои специализации существующих шаблонов добавлять. чего говорить о невинных forward-declarations?


KO>Кстати, что значит существуюших? Где в translation unit будет существовать std::set если мы не включали соответвсующий заголовок?


в translation unit нигде. от этого std::set не исчезнет из стандартной библиотеки.
Re[8]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 15:40
Оценка:
Здравствуйте, 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.
Re[9]: [MSVC] Вопрос про boost
От: breee breee  
Дата: 27.05.11 15:54
Оценка:
Здравствуйте, 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.

Не своих, а стандартных
Re[7]: [MSVC] Вопрос про boost
От: Abyx Россия  
Дата: 27.05.11 16:31
Оценка: -2 :)
Здравствуйте, k.o., Вы писали:

KO>Где в translation unit будет существовать std::set если мы не включали соответвсующий заголовок?

выучите сначала С++, толстый вы наш
In Zen We Trust
Re[10]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 17:07
Оценка:
Здравствуйте, 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>Не своих, а стандартных

специализации стандартных шаблонов для своих типов.
Re[8]: [MSVC] Вопрос про boost
От: k.o. Россия  
Дата: 27.05.11 17:25
Оценка:
Здравствуйте, 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.

(c)
Re[11]: [MSVC] Вопрос про boost
От: wander  
Дата: 28.05.11 17:39
Оценка:
Здравствуйте, k.o., Вы писали:

KO>...реализации стандартной библиотеки имеют право добавлять дополнительные шаблонные параметры, поэтому написать полностью переносимую forward declaration не получится.


Можешь подвердить это? Где конкретно в стандарте указана возможноть такого добавления?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.