以嵌套类为参数的友元模板声明
Friend template declaration with nested class as argument
C++常见问题解答提供了如何编写友元模板声明的指南。但是,当其中一个参数是模板类的嵌套结构时,我遇到了一个问题,例如:
template<typename T>
class MyClass;
template<typename T> QDataStream &operator<<(QDataStream &stream, const typename MyClass<T>::Node &node);
这两个版本都不起作用:
template<typename T>
class MyClass
{
private:
struct Node {};
friend QDataStream &operator<< <>(QDataStream &stream, const Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const MyClass::Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const MyClass::Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const typename MyClass<T>::Node &node);
friend QDataStream &operator<< <>(QDataStream &stream, const typename MyClass::Node &node);
};
template<typename T>
QDataStream &operator<<(QDataStream &stream, const typename MyClass<T>::Node &node)
{
return stream;
}
给出的错误(由MSVC 2017(是:
error: C2672: '<<': no matching overloaded function found
写这篇文章的正确语法是什么?
实时演示
此operator<<
永远不能用作运算符,因为T
只出现在非推导上下文中。出于同样的原因,编译器在试图准确地找出要匹配的函数模板的哪个专业化时,无法推导出模板参数。
还有一个小问题是,专门化命名了它无权访问的私有成员Node
(编译器在弄清楚声明命名的是哪个专门化之前,无法弄清楚friend
声明是否授予它这样的访问权限(。
通常的修复方法是将运算符定义为类模板定义中的内联非模板函数,或者将Node
提取到自己的类模板中。
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 类模板中文本运算符的友元声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 友元声明阻止外部函数访问类的私有部分
- C++:友元声明'声明一个非模板函数
- 友元声明及其表示的实体
- 嵌套类中需要前向声明的友元声明
- 多参数模板不能很好地处理友元声明
- 友元声明和显式模板实例化声明
- 为什么标准禁止部分专门化的友元声明
- is_constructible和is_destructibble不受友元声明的影响
- Pimpl习语和内部对象协作,无需友元声明
- C++中的友元声明-公共和私有之间的区别
- 单个成员而不是整个类的友元声明
- 关于 C++ 中友元声明的基本内容错误
- 有没有办法避免模板友元声明的外部可见性
- 如何解决c++中友元声明的循环依赖
- 指定默认实参的友元声明必须是定义