gpt4 book ai didi

c++ - 嵌套派生模板的运算符重载

转载 作者:太空狗 更新时间:2023-10-29 21:32:49 27 4
gpt4 key购买 nike

派生和嵌套 类的运算符重载有一些问题。我尝试了很多方法但失败了很多次。谁能帮忙解决这个问题?这是代码:

A 级:

template <typename T>
class A {
public:
virtual ~A() = default;
};

template <typename T>
ostream& operator<<(ostream& out, const A<T>& a) {
out << "in A\n";
return out;
}

B 级:

template <typename T>
class B : public A<T> {};

template <typename T>
ostream& operator<<(ostream& out, const B<T>& b) {
out << "in B\n";
return out;
}

和测试代码:

A<int> *pa = new B<int>();
B<int> *pb = dynamic_cast<B<int> *>(pa);
cout << *pa << typeid(*pa).name() << endl;
cout << *pb << typeid(*pb).name() << endl;

我从结果中得到了我需要的:

in A

1BIiE

in B

1BIiE

然后我创建了一个嵌套类,它也派生自 class A:

BB::B 类:

template <typename T>
class BB {
public:
class B : public A<T> {};
};

template <typename T>
ostream& operator<<(ostream& out, const typename BB<T>::B& b) {
out << "in BB::B\n";
return out;
}

但是当我用代码测试这个类时:

A<int> *pa2 = new BB<int>::B();
BB<int>::B *pb2 = dynamic_cast<BB<int>::B *>(pa2);
cout << *pa2 << typeid(*pa2).name() << endl;
cout << *pb2 << typeid(*pb2).name() << endl;

我只得到了意想不到的结果:

in A

N2BBIiE1BE

in A

N2BBIiE1BE

似乎编译器没有专门为 BB::B 重载运算符<<。这里有什么问题?

最佳答案

template <typename T>
ostream& operator<<(ostream& out, const typename BB<T>::B& b);

b 的类型处于非推导上下文中。它永远不会推导出T来自这个签名。

你可以称之为购买路过T明确地。或者您可以从 BB<T>::B 编写类型映射至 B并获得真正的幻想。但这并不值得。


最简单的选择是 Koenig 运算符。

template <typename T>
class BB {
public:
class B : public A<T> {
friend ostream& operator<<(ostream& out, const B& b){
out << "in BB::B\n";
return out;
}
};
};

此 Koenig 运算符是为 BB<T>::B 的每个实例化生成的非模板函数, 并且只能通过 ADL 找到。

关于c++ - 嵌套派生模板的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53679662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com