任何人都可以提供一个提示如何正确实现operator<<在提供的代码示例中用于MyType?
#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;
}
以上代码无法编译。但是当我改变运算符的定义&lt;&lt;注释掉一个,一切正常。这只是一个更复杂的问题的一个(非)工作示例,实际上MyType更加令人讨厌。在这个简单的例子中,我可以很容易地从'A'类中复制粘贴MyType的精确定义,但是在更复杂的情况下,当这个typedef依赖于antoher typedef时......引用它会很好。有没有解决这个问题的方法?
编辑:
编译器的输出错误(通常好像操作符&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
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;}
~~~~~~~~~ ^ ~~~~
答案 0 :(得分:2)
问题是未推断的上下文(感谢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,如果它适用于你更复杂的类 - 在不知道更多细节的情况下不可能说...
答案 1 :(得分:0)
所以我正在做这个作为答案
#include <iostream>
#include <map>
template <typename T>
class A{
public:
using MyType = std::map<unsigned int, T>;
MyType data;
void show();
friend std::ostream& operator<<(std::ostream& stream, const MyType& mm){
return stream << mm.size() << "\n";
}
};
template <typename T>
void A<T>::show(){
std::cout << data;
}
int main()
{
A<double> a;
std::cout << a;
return 0;
}
但是在编译时会发生一个众所周知的构建错误:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
此错误通常意味着类型扣除无法正常工作(不可扣除的上下文)(参见Why is template type deduction not working和ostream lvalue error)
因此,我认为,就目前而言,你应该找到解决这个问题的另一种方法,就像我现在想不到的那样。