我有一个名为“KeyedCollection”的模板类,它包含将数据插入向量以及流出数据的函数。向量是私有成员函数。我似乎无法弄清楚如何在我的重载ostream friend函数中使用此向量中的信息。注意:我不能改变类的一般结构和函数参数,它们必须保持原样。我列出了所有类以供参考,但有问题的函数是最后一个。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include "Windows.h"
#include <string>
using namespace std;
template <class K, class T>
class KeyedCollection {
public:
// Create an empty collection
KeyedCollection();
// Return the number of objects in the collection
int size() const;
// Insert object of type T with a key of type K into the
// collection using an “ignore duplicates” policy
void insert(const K&, const T&);
// Output data value of objects in the collection,
// one data value per line
friend ostream& operator<<(ostream&,
const KeyedCollection&);
private:
// Insert required members here
int objSize;
vector<T> objects;
};
template<class K, class T>
KeyedCollection<K,T>::KeyedCollection() {
objSize = 0;
vector<T> objects;
}
template<class K, class T>
int KeyedCollection<K,T>::size() const {
objSize = objects.size();
return objSize;
}
template<class K, class T>
void KeyedCollection<K,T>::insert(const K&,const T& c) {
objects.push_back(c);
}
// !!! function i am trying to define !!!
template<class K, class T>
ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst) {
outstream<<inst<<endl;
return outstream;
}
另外,我收到的错误是
“致命错误LNK1120:1个未解析的外部”
和一个说
“错误LNK2019:未解析的外部符号”class std :: basic_ostream&gt; &安培; __cdecl运算符&lt;&lt;(类std :: basic_ostream&gt;&amp;,类KeyedCollection const&amp;)“(?? 6 @ YAAAV?$ basic_ostream @ DU?$ char_traits @ D @ std @@@ std @@ AAV01 @ ABV ?$ KeyedCollection @ HVCustomer @@@@@ Z)在函数_main“...”
中引用作为一个附带问题,任何想法可能是什么?
答案 0 :(得分:0)
cppreference和Johannes Schaub - litb都提供了相同的方法来实现此功能。
你想制作一个单一的实例(在中称为“专业化”) 这个模板的通用术语是朋友。你这样做的方式如下 [...]
首先在你的班级定义之前做一个前瞻声明:
template <class K, class T> class KeyedCollection;
template<class K, class T>
ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst);
因为编译器从参数列表中知道该模板 参数是T和U,你不必把它们放在&lt; ...&gt;之间,所以 他们可以留空。
然后发表你的朋友声明并确保在<>
之后添加operator<<
:
template <class K, class T>
class KeyedCollection {
public:
// snip
friend ostream& operator<< <> (ostream& outstream,const KeyedCollection<K,T>& inst);
// snip
};
最后你可以定义它:
template<class K, class T>
ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst) {
// Just an example
for (const auto& t : inst.objects)
{
std::cout << t << std::endl;
}
return outstream;
}
或者,执行Yakk建议的内容。
template <class K, class T>
class KeyedCollection {
public:
// snip
friend ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst) {
for (const auto& t : inst.objects)
{
std::cout << t << std::endl;
}
return outstream;
}
// snip
};