2009-11-06 3 views
1

Я использую VS2005 и MS-реализацию STL. Однако класс type_info in объявляется вне «namespace std». Это создает некоторые проблемы для сторонних библиотек, которые исключают поиск std :: type_info. Почему это так, и есть ли какое-нибудь обходное решение? Вот пример с начала TypeInfo:Почему type_info объявляется вне пространства имен std?

class type_info { 
... 
}; 


_STD_BEGIN // = namespace std { 

ответ

3

Это интересно - (. 17.4.1.1 Библиотека содержимого) стандарт действительно говорит, что

Все библиотеки субъектов, кроме макросов, оператор новый и оператор удалять определяются в станд пространства имен или пространств имен, вложенных в пределах пространства имен Std.

И ясно говорит, что (идентификация 5.2.8 Type)

Результат выражения TypeID является именующей статическим типом сопзЬ станд :: type_info (18.5.1) и динамического типа Const станд :: type_info или const name, где name - это определенный реализацией класс, полученный из std :: type_info, который сохраняет поведение, описанное в 18.5.1.

Ans, конечно, descriptin заголовка <typeinfo?> указывают на то, что должно быть в пространстве имен std (18,5 идентификационным Тип):

Заголовок <typeinfo> синопсис

namespace std { 
    class type_info; 
    class bad_cast; 
    class bad_typeid; 
} 

Так type_info должен находиться в пространстве имен std (а не за его пределами). Я предполагаю, что либо это ошибка, либо есть большой набор кода (или небольшой набор важного кода), который нуждается в нем за пределами пространства имен std. Я бы подумал, что они используют некоторую магию препроцессора, чтобы вы могли заставить ее быть в пространстве имен std, если хотите (или наоборот), по умолчанию сделать это в std и разрешить макрос или что-то его принудительное к глобальному пространству имен).

Однако, один дополнительный морщин для type_info является то, что это результат оператора typeid (точнее, то, что происходит от type_info результата), так что, вероятно, жесткая зависимость от того, что делает компилятор для оператора typeid, что библиотека должна соответствовать.Таким образом, тот факт, что type_info не находится в пространстве имен std, возможно, объясняется тем, что делает компилятор с выражениями typeid, и, возможно, у библиотек есть небольшой контроль над этим (и я бы предположил, что это одна из причин, по которой не существует способа обхода метода preprocssor для проблема). Тот, кто знает намного больше о том, как работают компиляторы, чем я, должен был бы объяснить это лучше (или вывести его за рамки спекуляций).

Но я думаю, вам придется попросить кого-нибудь в Microsoft (или PJ Plauger/Dinkumware) для реального ответа на вопрос «почему».

+0

OK Я нашел комментарий в файле типаinfo. Parafracing, он сказал, что «type_info не входит в std namespace, поскольку компиляторы RTTI часто имеют собственную имплементацию». Я решил это, просто переместив его в std, против рекомендации в комментарии. – Rolle

+0

Не могли бы вы дать немного больше информации о местоположении этого комментария и/или версии компилятора для заголовка '', в котором вы его видели? –

+0

Только в начале файла, под всеми включает в себя и прагма-вызов. Файл предназначен для wince 6, и, вероятно, он появился либо с Platform Builder, либо с заранее построенным SDK когда-то давно. Это авторское право Microsoft. Вот полный комментарий: // Тип возврата из оператора typeid в соответствии со стандартом // это действительно должно быть в пространстве имен std, но компилятор // имеет встроенные знания об этом классе. Не изменяйте // ничего здесь, не проверяя расположение информации RTTI // сгенерированный компилятором. – Rolle

1

С using декларации, на самом деле, там являетсяstd::type_info. Могут быть сценарии, в которых проблема, которая не определена внутри std, может быть проблемой, но мне было бы интересно, если бы вы столкнулись с одним из них.

В чем проблема?

+0

Извините, я скопировал с неправильного класс. Тот, который я использовал, был фактически для Windows CE (также MS), и ему не хватает директивы use. Это ошибка в этой конкретной версии STL? – Rolle

+0

Если стандарт определяет класс как принадлежащий к 'std', тогда он должен быть определен как таковой, или ADL (поиск Koenig) может сломаться. – MSalters

0

Потому что Visual Studio делает всевозможные трюки, позволяющие работать с устаревшим кодом. IIRC, Стандарт только утверждает, что type_info существуют в пространстве имен std. Он не гарантирует, что он не существует в глобальном пространстве имен - это действительно решение об осуществлении.

Caveat Emptor: Я не проверял это в Стандарте.

+1

На самом деле причина, по которой стандарт резервирует префикс подчеркивания для реализации, заключается в том, что разработчики не могут просто требовать обычные имена. ':: _ typeinfo' будет разрешено. – MSalters

Смежные вопросы