c – 如何在类别变更之外声明泛型类的朋友?

以下代码有效,但我想移动ostream&操作符LT;&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”

上一篇:利用python实现微信好友分析(简单)


下一篇:C++友元