Ten kod kompiluje z brzękiem3.7.1 (bez diagnostyki), ale nie z GCC5.3.0 (live example):Szablon kompilacja błąd przyjaźń z GCC, ale nie z brzękiem
#include <iostream>
template<typename T>
struct A {
void foo()
{
static_cast<T*>(this)->implementation();
}
};
struct Crtp : A<Crtp> {
template<typename T>
friend struct A;
private:
void implementation() { std::cout << "implementation()\n"; }
};
int main()
{
Crtp c;
c.foo();
}
komunikat o błędzie
GCC jest następujący:
main.cpp:13:16: error: specialization of 'A' after instantiation friend struct A;
Który z nich ma rację, a dlaczego? Czy to błąd GCC/clang?
Jesteś poprawne. Co więcej, wydaje się, że gcc ma wiele [problemów znajomych] (https://gccnu.nu/bugzilla/showdependencytree.cgi?id=65608&hide_resolved=1). – akakatak