поиск статических функций из-за проблем с функцией шаблона в xlC

Пока я искал подсказки о проблеме компиляции, которая была у меня в источнике, я сталкивался с этим отчет об ошибке (по сравнению с исходным кодом движка 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 говорит об этом?

9

Решение

До 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), только объявления функций, найденные в
    либо контекст определения шаблона, либо контекст создания шаблона найдены.

9

Другие решения

V12.1 компилятора имеет новое поведение по умолчанию.

Если вы используете более раннюю версию компилятора xlC, используйте опцию -qdebug=KeepUnqualifiedStaticCandidate

4

По вопросам рекламы [email protected]