gpt4 book ai didi

c++ - 为类中定义的 typedef 定义 ostream operator<<

转载 作者:太空狗 更新时间:2023-10-29 21:34:53 37 4
gpt4 key购买 nike

谁能给我一个提示,说明如何在提供的代码示例中为 MyType 正确实现 operator<<?

#include <iostream>
#include <map>


template <typename T>
class A {
public:
typedef std::map<unsigned int, T> MyType;
MyType data;

void show();
};

template <typename T>
std::ostream& operator<<(std::ostream& stream, typename A<T>::MyType const& mm)
{
return stream << mm.size() << "\n";
}

//template <typename T>
//std::ostream& operator<<(std::ostream& stream, std::map<unsigned int, T> const& mm)
//{
// return stream << mm.size() << "\n";
//}

template <typename T>
void A<T>::show() {std::cout << data;}

int main() {
A<double> a;

a.show();

return 0;
}

以上代码无法编译。但是当我将 operator<< 的定义更改为注释掉一个时,一切正常。这只是一个更复杂问题的(不是)工作示例,实际上 MyType 更令人讨厌。在那个简单的例子中,我可以很容易地从“A”类中复制粘贴 MyType 的确切定义,但在更复杂的情况下,当这个 typedef 依赖于另一个 typedef 时......只引用它会很好。这个问题有什么解决办法吗?

编辑:

编译器的输出错误(通常就好像 operator<< 根本没有定义,所以当示例中 operator<< 的两个定义都被注释掉时,编译器会打印相同的错误)。

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++14 -MMD -MP -MF"src/ostreamTest.d" -MT"src/ostreamTest.o" -o "src/ostreamTest.o" "../src/ostreamTest.cpp"
../src/ostreamTest.cpp:27:31: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'MyType' (aka 'map<unsigned int, double>'))
void A<T>::show() {std::cout << data;}
~~~~~~~~~ ^ ~~~~

最佳答案

问题是非推导上下文(感谢 PasserBy 提供的链接),这使我们无法找到直接的解决方案。

解决方法可能是将 typedef 移出类,例如:

template <typename T>
using A_MyType = std::map<unsigned int, T>;

template <typename T>
class A
{
public:
typedef A_MyType<T> MyType;
MyType data;

void show();
};

template <typename T>
std::ostream& operator<<(std::ostream& stream, A_MyType<T> const& mm)
{
return stream << mm.size() << std::endl;
}

当然,如果它适用于您的更复杂的类,这对于 std::map 工作得很好——如果不了解更多细节就不可能说...

关于c++ - 为类中定义的 typedef 定义 ostream operator<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44950470/

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