Следующий код, который не компилируется под звоном, но делает при GCC и VS:clang bug? пространство имен класса шаблон друг
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
, он скомпилируется.
Код выглядит хорошо для меня, но, возможно, я не понимаю стандарт C++. Какой компилятор прав?
Замечание: если вы квалифицируете ':: bar', как' template класс friend :: bar; ', то clang компилирует его. Таким образом, похоже, что-то связано с видимостью друзей вне пространства имен. Глядя на какой-то вопрос SO, похоже, что clang ++ верен, хотя я еще не нашел обмана. –
vsoftco