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

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

2 ответа

Решение

До C++11 это было правильное поведение: неквалифицированное разрешение имен для имен, используемых в шаблонах, было определено только для поиска функций с внешней связью.

C++ 03 раздел 14.6.4.2 Функции-кандидаты [temp.dep.candidate] параграф 1:

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

Другие вопросы по тегам