运营商LT;<在模板类中;带命名空间;

时间:2017-04-08 15:43:11

标签: c++11 linker mingw

我在链接以下代码时遇到问题。链接器找不到朋友模板功能的实现。 知道为什么找不到它吗?

声明

// 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}}

1 个答案:

答案 0 :(得分:0)

没有运营商&lt;&lt;定义XY时的定义并使用运算符&lt;&lt;。您可以在源文件中定义模板,但uint16_t没有此模板的实例化。您可以通过源文件末尾的显式模板实例化来绕过。

template std::ostream& operator<< <uint16_t> (std::ostream& os, const XY<uint16_t>& rhs);

但我认为这不是一个好主意。您最好在头文件中声明和定义模板。