2016-06-28 85 views
0

下面是一段代码,重载< <操作:运算符<<重载,命名空间和模板

#include <iostream> 
using namespace std; 

namespace MyNamespace 
{ 
template <typename T> 
class MyClass 
{ 
    const int a = 5; 
    template <typename U> 
    friend std::ostream& operator<<(std::ostream &os, const MyClass<U>& obj); 
}; 
} 

template <typename U> 
std::ostream& operator<<(std::ostream &os, const MyNamespace::MyClass<U>& obj) 
{ 
    return cout << obj.a; 
} 

int main() 
{ 
    MyNamespace::MyClass<int> foo; 
    cout << foo; 

    // your code goes here 
    return 0; 
} 

当我编译,我得到一个“暧昧的重载‘操作< <’。

我不明白为什么...

+0

因为有一个'MyNamespace :: operator <<'和一个'operator <<' – tkausl

回答

2

你有

std::ostream& MyNamespace::operator<<(std::ostream &os, const MyClass<U>& obj); 
在类如 friend宣布在全局命名空间

std::ostream& operator<<(std::ostream &os, const MyNamespace::MyClass<U>& obj) 

。要告诉C++的第二个,全球性的,是你的朋友的功能,而不是一个在您的命名空间,追加::的名字:

std::ostream& ::operator<<(std::ostream &os, const MyClass<U>& obj); 

或者更好的是,移动功能,以自己的名称空间。

+4

比'MyClass'更好地移动'operator <<'在同一个'namespace'中。 – Jarod42

+0

问题是,成员a实际上在我的代码中是一个向量。我为矢量写了一个序列化程序,但不在MyNamespace中。如果我把MyClass的<<函数放在这个命名空间中,这似乎会导致麻烦。 编译器尝试将矢量转换为流(??)。 如果我编写第一个建议的解决方案,没问题。 – Oodini