Пока я искал подсказки о проблеме компиляции, которая была у меня в источнике, я сталкивался с этим отчет об ошибке (по сравнению с исходным кодом движка Mozilla) связанные с поиском функций. Цитирование из сообщения об ошибке:
TypedArrayTemplate (очевидно) является шаблоном и ссылается на INT_TO_JSVAL, статическую встроенную функцию, без префикса «::». Это ломает xlC, потому что не может разрешить INT_TO_JSVAL. Стандарт не требует рассмотрения статики, если неквалифицированное имя не найдено в контексте аргументов шаблона. g ++ делает этот запасной вариант, xlC — нет.
Информативное сообщение от компилятора:
(I) Static declarations are not considered for a function call if the function is not qualified.
В моем случае код, который не удался, был похож на это:
namespace N
{
static bool foo (std::string const &);
template <typename T>
void bar (T const &, std::string const & s)
{
// expected unqualified call to N::foo()
foo (s);
}
void baz (std::string const & s)
{
bar (s);
}
} // namespace N
Правильно ли поведение, которое реализует xlC? Где стандарт 2003 или 2011 говорит об этом?
До C ++ 11 это было правильное поведение: неквалифицированное разрешение имен для имен, используемых в шаблонах, было определено только для поиска функций с внешней связью.
C ++ 03 раздел 14.6.4.2 Функции-кандидаты [temp.dep.candidate] параграф 1:
Для вызова функции, который зависит от параметра шаблона, если имя функции является безусловным идентификатором, но не
template-id, функции-кандидаты находятся с использованием обычных правил поиска (3.4.1, 3.4.2) за исключением того, что:
Для части поиска с использованием поиска без определения имени (3.4.1), только объявления функций с внешним
ссылки из контекста определения шаблона найдены.Для части поиска, использующей связанные пространства имен (3.4.2), только объявления функций с внешним
найдена связь в контексте определения шаблона или в контексте создания шаблона.
который изменяется в C ++ 11 на:
Для вызова функции, который зависит от параметра шаблона, функции-кандидаты находятся с использованием обычного
правила поиска (3.4.1, 3.4.2, 3.4.3) за исключением того, что:
Только для части поиска, использующей поиск без определения имени (3.4.1) или поиск по квалифицированному имени (3.4.3), только
Найдены объявления функций из контекста определения шаблона.Для части поиска, использующей связанные пространства имен (3.4.2), только объявления функций, найденные в
либо контекст определения шаблона, либо контекст создания шаблона найдены.
V12.1 компилятора имеет новое поведение по умолчанию.
Если вы используете более раннюю версию компилятора xlC, используйте опцию -qdebug=KeepUnqualifiedStaticCandidate