Поиск статических функций из-за проблем с функцией шаблона в 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