Poniższy kod, który nie skompilować pod brzękiem ale robi pod gcc i VS:clang bug? przestrzeni nazw klasy szablon przyjaciel
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;
}
nie jest on z:
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
powinni mieć dostęp do foo
„s prywatny konstruktor, ale wygląda na to, że tak nie jest. Jeśli usuniemy namespace NS
, kompiluje.
Kod wygląda dobrze, ale może nie rozumiem standardu C++. Który kompilator jest poprawny?
Uwaga boczna: jeśli zakwalifikujesz ':: bar', np.' Szablon friend class :: bar; ', wtedy clang skompiluje go. Wygląda więc na coś związanego z widocznością znajomych poza obszarem nazw. Patrząc na niektóre pytania typu SO, wydaje się, że klajster ++ jest poprawny, chociaż nie znalazłem (jeszcze) duplikatu. –
vsoftco