我正在使用此处列出的书籍学习C++。现在,为了进一步检查我是否理解了这些概念,我也在编写简单的示例程序。下面给出了一个用msvc编译但不用clang和gcc编译的程序。演示。
template<typename P> struct C{
template<typename T>
struct E
{
template<typename U = P, typename V = T>
friend bool operator==(const typename C<U>::template E<V>&,
const typename C<U>::template E<V>&);
};
};
int main()
{
C<int>::E<double> d1, d2;
std::cout<<(d1==d2); //compiles with msvc but rejected in gcc and clang
}
因此,我的问题是根据标准,哪一个编译器就在这里(如果有的话(。
MSVC接受代码是错误的,因为它是格式错误的。这可以从温度参数#12中看出,该参数状态为:
如果友元函数模板声明指定了默认模板参数,则该声明应为定义,并且应为转换单元中函数模板的唯一声明。
(强调矿(
由于您提供的友元函数模板声明指定了默认的模板参数,而不是定义,因此程序格式不正确。因此,gcc和clang在拒绝程序时是正确的。
为了解决这个问题,您可以通过添加朋友函数模板的主体来提供一个定义。演示。
这是msvc错误报告:
无效的Friend函数模板运算符==使用msvc 编译