gpt4 book ai didi

c++ - 如何为模板的成员类型重载自由函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:26 24 4
gpt4 key购买 nike

我有一个模板类,它定义了一些成员类型。它类似于 std::map 的方式。定义它是 value_type基于它自己的模板参数,但在我的例子中,类型更复杂,所以它被定义为嵌套类。

现在为了调试,我想定义 operator<<对于那种类型。但是编译器告诉我它不能推断出外部模板的模板参数。

我的真实代码不像下面的例子那样做作,但这个做作的例子演示了我尝试的方法以及它是如何失败的:

#include <iostream>

template <typename Value> class Outer;

template <typename Value>
std::ostream &operator<<(std::ostream &, const typename Outer<Value>::Inner &);

template <typename Value>
class Outer {
public:
struct Inner {
Value x;
};

void PrintSomething(Value v) {
// the real program does something useful with the inner class, of course
Inner inner = { v };
std::cout << "Inner = " << inner << std::endl; // <---- THIS SAYS IT CAN'T FIND operator<<
};
};

template <typename Value>
std::ostream &operator<<(std::ostream &s, const typename Outer<Value>::Inner &v) {
return s << v.x;
}

int main() {
Outer<int> o;
o.PrintSomething(42);
return 0;
}

这是重现问题的完整示例。编译器(我试过其中的 3 个)说没有重载 operator<<这将采用 Outer<int>::Inner 类型的第二个参数.当我用没有其他重载的不同函数尝试同样的事情时,它反而说 C2783: could not deduce template argument for 'identifier' , gcc 和 clang 一直说没有带第二个参数的重载 Outer<int>::Inner ).

那么有没有办法定义operator<<服用Outer<Value>::Inner对于任何 Value因为它是正确的(所以它不能被定义为成员)参数?

注意:我需要它在多个编译器中编译,其中一些没有任何 C++11 功能,所以我需要它是 C++03。

最佳答案

你所拥有的是所谓的不可推导的上下文。怎么可能Value曾经被演绎过吗?您可以部分特化类模板,使编译器几乎不可能尝试和测试每个可能的实例化(其中有……嗯,无限)。

有两种解决方法:采用 Inner来自 Outer , 或制作 operator<<一个内联的 friend 。后者是人们通常采用的方式。

template<class T>
struct Outer{
struct Inner{
T value;
friend std::ostream& operator<<(std::ostream& os, Inner const& v){
return os << v.value:
}
};
// ...
};

关于c++ - 如何为模板的成员类型重载自由函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15412248/

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