我在链接以下代码时遇到问题。链接器找不到朋友模板功能的实现。 知道为什么找不到它吗?
声明
// XY.cpp
#include "XY.hpp"
namespace xxx
{
template<typename T>
std::ostream& operator<<(std::ostream& os, const XY<T>& rhs)
{
// ...
return os;
}
} /* namespace xxx */
定义
// main.cpp
#include "XY.hpp"
#include <iostream>
using namespace std;
using namespace xxx;
int main() {
XY<uint16_t> xy;
cout << xy;
return 0;
}
用法
undefined reference to 'std::ostream& xxx::operator<< <unsigned short>(std::ostream&, xxx::XY<unsigned short> const&)'
链接器返回错误:g++ -o "XXX" ./src/XY.o ./src/main.o
与gcc.EXE (GCC) 6.3.0
链接
版本:{{1}}
答案 0 :(得分:0)
没有运营商&lt;&lt;定义XY时的定义并使用运算符&lt;&lt;。您可以在源文件中定义模板,但uint16_t没有此模板的实例化。您可以通过源文件末尾的显式模板实例化来绕过。
template
std::ostream& operator<< <uint16_t> (std::ostream& os, const XY<uint16_t>& rhs);
但我认为这不是一个好主意。您最好在头文件中声明和定义模板。