重载 COUT 的未定义引用 [Duplicate]

undefined reference for overloaded cout [duplicate]

提问人:alle_meije 提问时间:1/5/2022 更新时间:1/5/2022 访问量:79

问:

我正在尝试是否可以将 2 维、3 维和 4 维向量的代码替换为 1 个类,因此使用 .vec2<T>vec3<T>vec4<T>vecN<typenameT,unsignedS>

这似乎效果很好,但是用于打印矢量的重载函数给出了错误。我看不出我所做的事情与平时不同:coutundefined reference

(最小化)类 :vectors.hpp

#include<vector>
#include<iostream>
#include<ranges>

template <typename T, unsigned S>
class vecN {
  template <typename U> friend std::ostream& operator<< ( std::ostream& out, const vecN<U,S>& v);
  template <typename U> friend std::istream& operator>> ( std::istream&  in,       vecN<U,S>& v);
protected:
  std::vector<T> 
  data;
public:
  vecN ( T* xyz ): data ( S ) { std::copy (xyz, xyz+S, data.begin() ); }
};

// non-members of vecN for vecN
template <typename T, unsigned S>
std::ostream& operator<<(std::ostream& out, const vecN<T,S>& v) { 
    out << "( ";
    std::copy(v, std::ostream_iterator<char>(out, ", "));
    out << "\b\b )"; // use two ANSI backspace characters '\b' to overwrite final ", "
    return out; 
}

template <typename T, unsigned S>
std::istream& operator>>(std::istream& in , vecN<T,S> &v) { 
    for ( auto i : std::views::iota(0u, S) )
        in >> v.data[i]; 
    return in;
}

// aliases for 2-, 3- and 4-dimensional vectors
template <typename T>
using vec2 = vecN<T,2>;

template <typename T>
using vec3 = vecN<T,3>;

template <typename T>
using vec4 = vecN<T,4>;

测试文件:main.cpp

#include "vectors.hpp"
int main() {  
  float v[2] = { 10, 20 };
  vec2<float> v2_1 ( v );  
  std::cout << "vector v2_1 \n" << v2_1 << "\n";  
  return 0;  
}

当我用以下命令编译它们时:

g++ -std=c++20 -o test main.cpp vectors.hpp 

然后我收到错误

in function `main':
main.cpp:(.text+0x6a): undefined reference to `std::ostream& operator<< <float>(std::ostream&, vecN<float, 2u> const&)'
collect2: error: ld returned 1 exit status

但是这个向量类型(浮点值,大小 2)的编译代码应该以二进制文件结束,不是吗?类型和值确定正确,但似乎不包括代码?test

C++ 模板 链接器错误 cout friend

评论

2赞 Alan Birtles 1/5/2022
您的友元声明适用于具有单个模板参数的函数,但您的定义有两个模板参数,因此不匹配
0赞 alle_meije 1/5/2022
啊,谢谢!我本来希望这很容易——不知道我是怎么想到我可以“重用”S 作为第二个参数,同时不得不使用一个新参数而不是 T 的......

答: 暂无答案