c++ - 将流运算符与模板类一起使用

标签 c++ templates friend stream-operators

我正在创建一个矩阵类并具有以下声明。目的是构建一个可扩展的矩阵类,该类具有灵活的算法并且可以在各种平台上运行 -

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 谢谢, 拉吉

最佳答案

友元声明声明了一个名为operator<< 的非模板函数; xss_matrix 的每个实例化盖掉一份新的声明。这些函数都没有实际定义。

然后是函数模板的单一定义,重载所有这些声明。它没有被声明为 friend 。

然而,在重载决议期间,非模板重载获胜,其他条件相同。所以编译器选择其中之一。但它从未被定义,所以链接器会提示。

如果你真的想成为模板的 friend ,就必须这样做:

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
}

但是,将非友元函数模板简单地委托(delegate)给公共(public)成员函数通常会更容易:

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

关于c++ - 将流运算符与模板类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51444640/

相关文章:

c++ - friend 类 : inherited classes are not friend as well?

c++ - System.Runtime.Serialization.SerializationException 的问题

c++ - 是否有可能在 C++ 中获取类型别名的名称?

c++ - 是否可以编写一个函数,它接受具有不同初始化的模板参数

c++ - 在模板中定义友元函数的实例化

C++ - 使用friend关键字来提高效率?

c++ - 尝试用值初始化列表但在我使用变量创建大小时不起作用

c++ - 我是否需要同步 std::condition_variable/condition_variable_any::notify_one

C++编译错误

python - 模板中的 django forloop 计数器