Сообщение Re: Ошибка копиляции шаблона в clang от 14.07.2015 13:07
Изменено 14.07.2015 13:08 Evgeny.Panasyuk
Здравствуйте, dolgop8791, Вы писали:
D>Если перенести описание соответствующего оператора выше определения TEST, то пример скомпилируется. Вопрос в том кто же прав из компиляторов
Думаю прав Clang. Вот здесь
Конкретная цитата из стандарта:
instantiation") — смотри дискуссию по ссылке, но это не важно для этого примера))
D>и почему clang-у не нравится только третий вариант.
Ему не нравится вариант void operator<<= (CORBA::Any&, PortableGroup::Holder*);
Здесь ни в одном из namespace ассоциированных с типами параметров нет нужного оператора, и поиск происходит только в "at the point of definition of the template".
В двух других случаях оператор есть в namespace ассоциированным с AnyTest, либо с HolderTest — это глобальный namespace — и поиск происходит в том числе в этом namespace в instantiation context.
D>Если перенести описание соответствующего оператора выше определения TEST, то пример скомпилируется. Вопрос в том кто же прав из компиляторов
Думаю прав Clang. Вот здесь
Автор: Evgeny.Panasyuk
Дата: 08.11.13
было обсуждение на схожую тему.Дата: 08.11.13
Конкретная цитата из стандарта:
То есть поиск происходит в контексте определения шаблона (в твоём случае это конструктор TEST), и в namespace'ах ассоциированных с типами параметров функции — причём в этом случае используется контекст instantiation (в твоём случае это функция test (хотя тут немного сложнее ("the end of the translation unit is also considered a point of14.6.4 Dependent name resolution [temp.dep.res]
In resolving dependent names, names from the following sources are considered:
— Declarations that are visible at the point of definition of the template.
— Declarations from namespaces associated with the types of the function arguments both from the instantiation context (14.6.4.1) and from the definition context.
instantiation") — смотри дискуссию по ссылке, но это не важно для этого примера))
D>и почему clang-у не нравится только третий вариант.
Ему не нравится вариант void operator<<= (CORBA::Any&, PortableGroup::Holder*);
Здесь ни в одном из namespace ассоциированных с типами параметров нет нужного оператора, и поиск происходит только в "at the point of definition of the template".
В двух других случаях оператор есть в namespace ассоциированным с AnyTest, либо с HolderTest — это глобальный namespace — и поиск происходит в том числе в этом namespace в instantiation context.
Re: Ошибка копиляции шаблона в clang
Здравствуйте, dolgop8791, Вы писали:
D>Если перенести описание соответствующего оператора выше определения TEST, то пример скомпилируется. Вопрос в том кто же прав из компиляторов
Думаю прав Clang. Вот здесь
Конкретная цитата из стандарта:
D>и почему clang-у не нравится только третий вариант.
Ему не нравится вариант void operator<<= (CORBA::Any&, PortableGroup::Holder*);
Здесь ни в одном из namespace ассоциированных с типами параметров нет нужного оператора, и поиск происходит только в "at the point of definition of the template".
В двух других случаях оператор есть в namespace ассоциированным с AnyTest, либо с HolderTest — это глобальный namespace — и поиск происходит в том числе в этом namespace в instantiation context.
D>Если перенести описание соответствующего оператора выше определения TEST, то пример скомпилируется. Вопрос в том кто же прав из компиляторов
Думаю прав Clang. Вот здесь
Автор: Evgeny.Panasyuk
Дата: 08.11.13
было обсуждение на схожую тему.Дата: 08.11.13
Конкретная цитата из стандарта:
То есть поиск происходит в контексте определения шаблона (в твоём случае это конструктор TEST), и в namespace'ах ассоциированных с типами параметров функции — причём в этом случае используется контекст instantiation (в твоём случае это функция test (хотя тут немного сложнее ("the end of the translation unit is also considered a point of instantiation") — смотри дискуссию по ссылке, но это не важно для этого примера))14.6.4 Dependent name resolution [temp.dep.res]
In resolving dependent names, names from the following sources are considered:
— Declarations that are visible at the point of definition of the template.
— Declarations from namespaces associated with the types of the function arguments both from the instantiation context (14.6.4.1) and from the definition context.
D>и почему clang-у не нравится только третий вариант.
Ему не нравится вариант void operator<<= (CORBA::Any&, PortableGroup::Holder*);
Здесь ни в одном из namespace ассоциированных с типами параметров нет нужного оператора, и поиск происходит только в "at the point of definition of the template".
В двух других случаях оператор есть в namespace ассоциированным с AnyTest, либо с HolderTest — это глобальный namespace — и поиск происходит в том числе в этом namespace в instantiation context.