提问人:alle_meije 提问时间:1/5/2022 更新时间:1/5/2022 访问量:79
重载 COUT 的未定义引用 [Duplicate]
undefined reference for overloaded cout [duplicate]
问:
我正在尝试是否可以将 2 维、3 维和 4 维向量的代码替换为 1 个类,因此使用 .vec2<T>
vec3<T>
vec4<T>
vecN<typenameT,unsignedS>
这似乎效果很好,但是用于打印矢量的重载函数给出了错误。我看不出我所做的事情与平时不同:cout
undefined 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
答: 暂无答案
上一个:为什么模板只能在头文件中实现?
评论