繁体   English   中英

以嵌套类作为参数的朋友模板声明

[英]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仅出现在非推论上下文中。 出于同样的原因,当试图准确找出要匹配的函数模板的哪种专业性时,编译器无法推导template参数。

还有一个小问题,即专业化命名了它没有访问权限的私有成员Node (编译器无法弄清楚friend声明是否授予了这种访问权限,直到它弄清楚了该声明指定了哪个专业化名称为止)。

通常的解决方法是将运算符定义为类模板定义中的内联非模板函数,或者将Node提取到其自己的类模板中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM