将流运算符与Template类一起使用
Using stream operator with Template Class
我正在创建一个矩阵类,并有以下声明。其目的是构建一个可扩展的矩阵类,该类具有灵活的算法,可以在各种平台上运行-
template<typename T> class xss_matrix{
public:
xss_matrix(int i=0, int j=0):
max_row(i), max_col(j)
{
/*create space for the (0,0) entry*/
matrix[0]= (T*)(malloc(sizeof(T)));
};
~xss_matrix()
{
};
void add_entry(int row, int col, T val);
T get_entry(int row, int col);
friend ostream& operator<<(ostream &out, const xss_matrix<T> &m_xss_matrix);
private:
/*Internal variables*/
int max_row, max_col;
/*Internal data structures*/
T* matrix[];
/*Internal methods*/
void add_columns(int row, int col);
void add_rows(int row, int col);
};
#endif
然后我超载流运营商-
/*Overloaded stream operators*/
template<typename T> std::ostream& operator<<(ostream &out, const xss_matrix<T> &m_xss_matrix)
{
for(int ii = 0; ii < m_xss_matrix.max_row+1; ii+=1){
for(int jj = 0; jj < m_xss_matrix.max_col+1; jj+=1){
std::cout <m_xss_matrix.matrix[ii][jj] << " ";
}
std::cout << std::endl;
}
}
但是当我运行这个-
#include "xss_matrix.hpp"
int main(int argc, char** argv)
{
xss_matrix<double>* foo = new xss_matrix<double>;
xss_matrix<double> bar;
foo->add_entry(0,0,2.35);
foo->add_entry(0,1,1.75);
foo->add_entry(1,0,1.50);
foo->add_entry(1,1,2.00);
std::cout << *foo;
}
我收到一个链接器错误-
[mitra@vlch-mitra xss_src]$ make
g++ -c -o main.o main.cpp -g -I. -fpermissive
In file included from xss_matrix.hpp:1,
from main.cpp:1:
xss_matrix.h:36: warning: friend declaration `std::ostream& operator<<(std::ostream&, const xss_matrix<T>&)' declares a non-template function
xss_matrix.h:36: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
g++ -o main main.o -g -I. -fpermissive
main.o: In function `main':
/home/mitra/dv/libparser/xss_src/main.cpp:15: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, xss_matrix<double> const&)'
collect2: ld returned 1 exit status
make: *** [main] Error 1
[mitra@vlch-mitra xss_src]$
我不理解编译器警告,我确信这会导致链接器失败。有人能帮忙吗?gcc的版本为4.4.7-4谢谢Raj
friend声明声明了一个名为operator<<
的非模板函数;CCD_ 2的每个实例化都标记出一个新的声明。这些函数实际上都没有定义。
然后是函数模板的单一定义,重载所有这些声明。它没有被宣布为朋友。
然而,在过载解决过程中,非模板过载获胜,其他情况相同。所以编译器选择其中一个。但它从未定义过,所以链接器会抱怨。
如果你真的想和一个模板交朋友,就必须这样做:
template<typename T> class xss_matrix;
template<typename T>
std::ostream& operator<<(ostream &out, const xss_matrix<T>& m_xss_matrix);
template<typename T> class xss_matrix {
// Implementation here
template <typename U>
friend std::ostream& operator<<(ostream &out, const xss_matrix<U>& m_xss_matrix);
};
template<typename T>
std::ostream& operator<<(ostream &out, const xss_matrix<T> &m_xss_matrix) {
// Implementation here
}
然而,通常更容易将非好友函数模板简单地委托给公共成员函数:
template<typename T> class xss_matrix {
public:
void print(ostream& out) {
// Write data to out
}
};
template<typename T>
std::ostream& operator<<(ostream &out, const xss_matrix<T> &m_xss_matrix) {
m_xss_matrix.print(out);
return out;
}
friend
函数模板的正确声明是:
template<class U>
friend ostream& operator<<(ostream &out, const xss_matrix<U> &m_xss_matrix);
T* matrix[];
的内存分配不正确。将T* matrix[];
替换为std::vector<T> matrix;
。这也自动修复了所有编译器生成的复制/移动构造函数/赋值和析构函数(您可以删除您的(。按行和列进行索引是matrix[row * max_col + col]
。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 传递给std::function template的template参数究竟代表什么
- 在template中使用std::variant的template函数
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 为什么在template函数广播中把两个extensor表达式加在一起不正确
- 将流运算符与Template类一起使用
- "Function template has already been defined"与相互排斥的"enable_if"一起
- 引用与template-template类一起折叠
- 如何将"extern template"与同一类中的模板成员使用的嵌套类一起使用?