Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 操作员<&书信电报;用于模板类的内部类_C++_Templates_C++11 - Fatal编程技术网

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;
    }
};