从李普曼等人C++引物第5版,部分16.1.2:朋友比较和在C++类模板的关系运算符
//forward declarations needed for friend declarations in Blob
template <typename> class BlobPtr;
template <typename> class Blob;
template <typename T> bool operator==(const Blob<T>&, const Blob<T>&)
template <typename T> class Blob {
friend class BlobPtr<T>;
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
}
第一个问题:在线路
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
为什么在==
之后出现<T>
?为什么不简单地写
friend bool operator==(const Blob<T>&, const Blob<T>&);
我添加了下面的代码来定义运算符==和实例化类模板。它成功地编译和链接:
template <typename T>
bool operator==(const Blob<T> &lhs, const Blob<T> &rhs) {return true;}
int main() {
Blob<int> a, b;
a == b;
}
如果我删除<T>
在friend声明如下operator==
,我得到一个链接错误:
Undefined symbols for architecture x86_64: "operator==(Blob<int> const&, Blob<int> const&)", referenced from: _main in partial_blob-3ccda9.o
显然<T>
以下operator==
是必要的,但为什么呢?
第二个问题:如果我想定义比运营商<
关系少为同一类,我想我应该遵循的==
工作模式:
1)前瞻性声明的操作
2)申报经营者为友,在插入附加<T>
其功能我不明白
3)定义了运营商外的类。
因此,我添加以下代码:
template <typename T> bool operator<(const Blob<T>&, const Blob<T>&);
template <typename T> class Blob {
//other members as before
friend bool operator<<T>(const Blob<T>&, const Blob<T>&);
}
bool operator<(const Blob<T>&, const Blob<T>&) {return true;}
int main() {
//other statements as before
a < b;
}
这将产生围绕operator<<T>
编译错误,我想是因为编译器把<<
作为插入运算符。但是,如果我重写朋友宣布为
friend bool operator<(const Blob<T>&, const Blob<T>&);
然后我得到==
类似于早期的链接错误链接错误:
"operator<(Blob<int> const&, Blob<int> const&)", referenced from: _main in partial_blob-a85d5d.o
我怎样才能成功地定义操作<
这个类?
(注:因为更完全实现实现依赖于私有变量的运营商必须声明为朋友)
请记住,像这样声明的朋友函数不是成员函数,它们是非成员函数,没有''函数不完整。至于'运营商<'尝试在运营商名称和模板(如运营商< )之间添加一个空格。 –
关于未定义的参考及其原因和解决方案(如您所知); http://stackoverflow.com/a/35891188/3747990 – Niall
@JoachimPileborg - 你能提供一个对这个语法介绍的参考吗?我甚至不知道它叫什么,所以我很难查找它。它是模板专业化吗?显式实例化?对这些术语进行网络搜索不会产生有用的结果。 – Chad