Добрый день.
Есть код:
namespace CORBA {
class Any {};
}
class AnyTest {};
namespace PortableGroup {
class Holder {};
}
class HolderTest {};
template<typename Any, typename Ptr>
class TEST {
public:
TEST () {
Any any;
any <<= this->x_;
}
private:
Ptr x_;
};
void operator<<= (CORBA::Any&, PortableGroup::Holder*);
void operator<<= (CORBA::Any&, HolderTest*);
void operator<<= (AnyTest&, PortableGroup::Holder*); // если перенести описание оператора перед TEST, пример скомпилируется.
void test (PortableGroup::Holder * excep_holder) {
TEST<AnyTest, PortableGroup::Holder*> test1;
TEST<CORBA::Any, HolderTest*> test2;
TEST<CORBA::Any, PortableGroup::Holder*> test3;
}
Он компилится msvc, gcc и icc. А вот clang не нравится test3:
16 : error: no viable overloaded '<<='
any <<= this->x_;
~~~ ^ ~~~~~~~~
29 : note: in instantiation of member function 'TEST::TEST' requested here
Если перенести описание соответствующего оператора выше определения TEST, то пример скомпилируется. Вопрос в том кто же прав из компиляторов и почему clang-у не нравится только третий вариант.