Переносимость шаблона C ++ - PullRequest
       15

Переносимость шаблона C ++

4 голосов
/ 05 февраля 2010

Я обновляю кодовую базу, которой 10 лет, и использую Metrowerks Code Warrior на Mac и Windows.

Я обновляюсь до OS X, XCode 3.2, Universal Binary.

Кажется, я получаю много ошибок, связанных с шаблонами, и не являюсь гением в шаблонах (и забывая съесть здоровую дозу замороженных шаблонов на завтрак), я задаюсь вопросом о переносимости шаблонов.

IIRC, шаблоны являются / или могут зависеть от компилятора?

У кого-нибудь есть совет или учебник по шаблонам, которые они рекомендуют?

Ответы [ 4 ]

5 голосов
/ 05 февраля 2010

Да и нет - наиболее разумный шаблонный код, написанный для одного текущего компилятора, будет отлично работать на других текущих компиляторах. Со временем компиляторы прогрессировали, поэтому много нового кода не будет работать на старых компиляторах, и наоборот. Самый большой преступник со старым кодом на новых компиляторах нуждается в "typename" во многих местах, где старые компиляторы будут принимать код без него.

Самая распространенная проблема с кодом примерно такая:

template <class T>
class XYZ { 
    T::y a;
};

Большинство старых компиляторов (неправильно) интерпретируют "T :: y" как тип - но в шаблоне на самом деле невозможно быть уверенным в этом, потому что T может быть любого типа. Чтобы код работал с современным (более точным) компилятором, вам нужно изменить его на: typename T::y a;, чтобы компилятор знал, что T::y - это имя типа.

1 голос
/ 05 февраля 2010

Способность компиляторов значительно улучшилась за десять лет.
Я бы поставил под сомнение соответствие стандартов компилятора и STL 10 лет назад. Я полагаю, что стандарт только что был введен десять лет назад, и компиляторам требуется некоторое время, чтобы догнать стандарт.

В современных компиляторах, я думаю, вы обнаружите, что код шаблона относительно переносим между компиляторами, и комитет по стандартам очень внимательно относится к изменениям в стандарте, чтобы убедиться, что он не нарушает совместимость (очень часто).

1 голос
/ 05 февраля 2010

Сами шаблоны имеют четко определенное поведение, как определено в §14 стандарта.

Что зависит от реализации - это пределы использования шаблона. Например, из Приложения B (в котором перечислены рекомендуемые предельные минимумы):

  • Аргументы шаблона в объявлении шаблона [1024].
  • Рекурсивно вложенные экземпляры шаблонов [17].

Если вы больше зависите от поведения, это может зависеть от реализации. Следует отметить, что компилятор не должен предоставлять эти минимальные ограничения, чтобы оставаться совместимым со стандартами.

Если вы публикуете какой-то фактический код / ​​ошибки, мы можем сообщить вам, почему вы получаете ошибку. Вероятно, ваш старый код использовал некоторые специфичные для компилятора расширения или иным образом позволял использовать явно запрещенное поведение.

0 голосов
/ 05 февраля 2010

В 2000 году не было ни одного компилятора, который бы реализовывал все аспекты стандартных шаблонов. Я бы осмелился сказать, что никто даже не осознал, что было возможно с шаблонами, пока Александреску не выпустил свой дизайн Modern C ++ в 2001 году.

Тем не менее, Metrowerks был одним из лучших. Если он компилируется в 7-й или более поздней версии, вполне возможно, что он будет работать на современном, более совместимом со стандартами, довольно быстром компиляторе.

Если я правильно помню, самая большая проблема с компиляторами Metrowerks в первые дни заключалась в том, что везде, где появлялось typename, то, что следовало, просто интерпретировалось как тип, независимо от того, что последовало за ним.

Это означало, что вы могли бы делать, и я видел, совершенно нестандартные вещи с этим, как, например, прямое объявление typedefs.

Еще одна часть шаблонов, на которые у них ушло довольно много времени, чтобы все было правильно, это все, что связано с w.r.t. параметры шаблона шаблона и параметры шаблона по умолчанию.

Опубликуйте некоторые конкретные ошибки, если вы не можете заставить их работать, они, вероятно, все попадут в один или два «класса» проблем, и кто-то быстро сможет вам помочь.

Как я уже сказал, у Metrowerks был довольно хороший компилятор C ++, особенно их реализация STL, во многом благодаря Говарду Хиннанту Я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...