以下代码有效,但我想移动ostream&操作符LT;<我在hash :: operator []之外的类declearation之外.
#include<iostream>
#include<map>
using namespace std;
template <class T>
class hash {
private:
map<string, T> _map;
public:
T& operator[] (string x);
friend ostream& operator<<(ostream& out, const hash<T> &rhs) { return out << "test"; }
};
template <class T>
T & hash<T>::operator[](string x) {
return _map[x];
}
int main () {
hash<int> myobject;
myobject["a"] = 1;
cout << myobject["a"] << endl;
cout << myobject << endl;
return 0;
}
我试过了:
template <class T>
ostream& operator<<(...) {
return out << "test";
}
和
ostream& operator<<(...) {
return out << "test";
}
以及其他一些组合无济于事.
解决方法:
使用朋友和模板时必须小心
#include<iostream>
#include<map>
template <class T>
class MyHash{
public:
// ... use your T template here
template <class U>
friend ostream& operator<<(ostream& out, const MyHash<U> &rhs);
};
// ...
template <class U>
ostream& operator<<(ostream& out, const MyHash<U> &rhs){ return out << "test"; }
你需要使用不同的模板U,因为运算符<<是朋友方法(外部),如果我们使用T而不是U,我们将在模板中使用:模糊定义. 通过MyHash更改哈希以避免歧义. 编辑: 你得到here的错误是:
error C2676: ‘<‘ binaire : ‘std::string’ ne définit pas cet opérateur
ou une conversion vers un type acceptable pour l’opérateur prédéfini
因为你忘了包含< string>在“hash.h”中.该标题定义了<操作符.
并且还尝试移动operator []和operator<<的定义.直接进入“hash.h”
必须包含模板的声明和定义.这是因为在某些编译器中,模板函数无法独立编译和链接,因为它们是在对实例化的特定类型的请求时生成的.
将#include“hash.cpp”更改为#include“hash.h”