Рассмотрим следующий пример:
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
не является зависимым именем, и его члены должны нормально проверяться во время определения шаблона. Есть ли нюансы, которые я не вижу?