Следующий код, который не компилируется под clang, но работает под gcc и VS:
template<typename T> class bar;
namespace NS
{
template<typename T>
class foo
{
foo() {}
template<typename U> friend class bar;
};
}
template<typename R>
class bar
{
public:
bar()
{
NS::foo<int> f;
}
};
int main(int, char **)
{
bar<int> b;
return 0;
}
Сбой:
main.cpp:20:22: error: calling a private constructor of class 'NS::foo<int>'
NS::foo<int> f;
^
main.cpp:8:9: note: implicitly declared private here
foo() {}
^
bar
должен иметь доступ к foo
частному конструктору, но похоже, что нет. Если я удалю namespace NS
, он скомпилируется.
Код выглядит хорошо для меня, но, возможно, я не понимаю стандарт С++. Какой компилятор прав?