Рассмотрим следующий пример:
class A
{
void foo();
public:
void bar();
};
template <class> class B
{
B()
{
A a;
a.foo(); // 1
A::bar(); // 2
a.bar(1); // 3
}
};
Примечание B никогда не создается.
clang++ сообщает все три маркированные строки как ошибочные. g++ (4.8.3) принимает строки 1 и 2 и только сообщает строку 3.
Если B создается, g++ с радостью сообщает о всех трех строках как ошибочные.
Является ли это ошибкой g++? Можно так думать. A не является зависимым именем, и его члены должны нормально проверяться во время определения шаблона. Есть ли нюансы, которые я не вижу?