C++ 使用GCC但不使用clang编译模板时出错

C++ 使用GCC但不使用clang编译模板时出错,c++,gcc,clang,friend,crtp,C++,Gcc,Clang,Friend,Crtp,此代码使用clang3.7.1(无诊断)编译,但使用GCC5.3.0()编译失败: #包括 模板 结构A{ void foo() { 静态_cast(this)->implementation(); } }; 结构Crtp:A{ 模板 朋友结构A; 私人: void implementation(){std::cout我认为这是gcc的错误 模板友元类声明只是一个声明,而不是一个定义。 允许重新声明类模板,除非其具有不同的类密钥(参见N4527 14.5.1.4) 专门化或实例化可以发生两次或两

此代码使用clang3.7.1(无诊断)编译,但使用GCC5.3.0()编译失败:

#包括
模板
结构A{
void foo()
{
静态_cast(this)->implementation();
}
};
结构Crtp:A{
模板
朋友结构A;
私人:

void implementation(){std::cout我认为这是gcc的错误

模板友元类声明只是一个声明,而不是一个定义。 允许重新声明类模板,除非其具有不同的类密钥(参见N4527 14.5.1.4)

专门化或实例化可以发生两次或两次以上。 显式专门化只能发生一次(N4527 14.7.3.6)


然后,gcc的诊断很奇怪,因为没有明确的专门化。

似乎是一个老的g++错误()


报告且从未更正,如果我理解正确,

我们确实有一些模板名称解析几率:

struct Crtp : A<Crtp> {
  A x; // A refers to A<Crtp>
};
struct-Crtp:A{
A x;//A表示A
};
现在情况清楚了:

template<typename T> friend struct A; 
模板友元结构A;
指:

template<typename T> friend struct A<Crtp>; 
模板友元结构A;
这是…是的,部分专业化(非常棘手的一个)

所以GCC在这里是正确的

您真正需要的是:

struct Crtp : A<Crtp> {
friend struct A;
private:
    void implementation() { std::cout << "implementation()\n"; }
};
struct-Crtp:A{
朋友结构A;
私人:

void implementation(){std::您是否正确。此外,gcc似乎有很多。
struct Crtp : A<Crtp> {
friend struct A;
private:
    void implementation() { std::cout << "implementation()\n"; }
};