C++ 操作员<&书信电报;用于模板类的内部类
我想实现C++ 操作员<&书信电报;用于模板类的内部类,c++,templates,c++11,C++,Templates,C++11,我想实现操作符这不起作用,因为typename X::Y是一个依赖类型。如果要打印例如int,编译器是否应该测试U的所有可能类型(由于递归,有无限多个类型)以检查typename X::Y是否会产生int(考虑模板专业化!)?因此,唯一的可能性是在friend语句中实现函数权限: class Y { public: Y(T d): data(d) {} private: T data; friend std::ostream &operator <<
操作符这不起作用,因为typename X::Y
是一个依赖类型。如果要打印例如int
,编译器是否应该测试U
的所有可能类型(由于递归,有无限多个类型)以检查typename X::Y
是否会产生int
(考虑模板专业化!)?因此,唯一的可能性是在friend语句中实现函数权限:
class Y {
public:
Y(T d): data(d) {}
private:
T data;
friend std::ostream &operator <<(std::ostream &os, Y const& y)
{
os << "Y(" << y.data << ")";
return os;
}
};
Y类{
公众:
Y(td):数据(d){
私人:
T数据;
friend std::ostream&operator在typename X::Y
中的U
是在一个非推导的上下文中。它是有效的。为什么编译器不能使用统一来匹配所有定义的运算符?我不明白统一的含义。在这种情况下,在常量typenam中推导U
在技术上是可能的e X::Y&
来自X::Y
,但由于(部分)模板专业化,情况并非总是如此。在以下情况下,编译器应该如何操作?
error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'const X<int>::Y')
os << "X " << x.y;
^
class Y {
public:
Y(T d): data(d) {}
private:
T data;
friend std::ostream &operator <<(std::ostream &os, Y const& y)
{
os << "Y(" << y.data << ")";
return os;
}
};