6

我在为模板类重载 operator<< 时遇到问题。我正在使用 Visual Studio 2010,这是我的代码。

#ifndef _FINITEFIELD
#define _FINITEFIELD
#include<iostream>

namespace Polyff{
    template <class T, T& n> class FiniteField;
    template <class T, T& n> std::ostream& operator<< (std::ostream&, const FiniteField<T,n>&);

    template <class T, T& n> class FiniteField {
    public:
            //some other functions
    private:
        friend std::ostream& operator<< <T,n>(std::ostream& out, const FiniteField<T,n>& obj);
        T _val;
    };

    template <class T, T& n>
    std::ostream& operator<< (std::ostream& out, const FiniteField<T,n>& f) {
        return  out<<f._val;
    }
    //some other definitions
}
#endif

主要我只有

#include"FiniteField.h"
#include"Integer.h"
#include<iostream>
using std::cout;
using namespace Polyff;
Integer N(5);

int main () {

    FiniteField<Integer, N> f1;
    cout<< f1;  
}

whereInteger只是int我需要的一些特殊功能的包装。

但是,当我编译上面的代码时,我得到了错误 C2679,它说binary '<<' : no operator found which takes a right-hand operand of type 'Polyff::FiniteField<T,n>' (or there is no acceptable conversion)

我还尝试删除朋友声明中的参数,因此代码变为:

friend std::ostream& operator<< <> (std::ostream& out, const FiniteField<T,n>& obj);

但这会产生另一个错误:C2785:'std::ostream &Polyff::operator <<(std::ostream &,const Polyff::FiniteField<T,n> &)' and '<Unknown>' have different return types

所以我想知道我应该如何更改代码以便编译,为什么?谢谢!

------------------------- 编辑于 2012.12.31 -------------------- --------

代码现在用 g++ 编译。是github存储库。

4

3 回答 3

1

这似乎按预期工作:

namespace Polyff{
  template <class T, T* n> class FiniteField;
  template <class T, T* n> std::ostream& operator<< (std::ostream&, const FiniteField<T,n>&);

  template <class T, T* n> class FiniteField {
  public:
    //some other functions
  private:
    friend std::ostream& operator<< <T,n>(std::ostream& out, const FiniteField<T,n>& obj);
    T _val;
  };

  template <class T, T* n>
  std::ostream& operator<< (std::ostream& out, const FiniteField<T,n>& f) {
    return  out << f._val.n; // I added the field of my Integer class
  }
  //some other definitions
}


struct Integer{
  Integer() : n(0){}
  Integer(int nn) : n(nn){}
  int n;
};

using std::cout;
using namespace Polyff;
Integer N(5);

int main () {
  FiniteField<Integer, &N> f1;
  cout<< f1;  
}

我只是用模板参数中的对象指针替换了引用,因为指向全局对象(静态或非静态)的指针是编译时(或至少链接时)已知的信息。我不知道接受参考的语言。

请注意,在此示例中,0将打印,因为它对应于_val.

于 2013-02-22T21:23:37.877 回答
0

我试图在我的 Visual C++ 2010 上编译你的代码。我得到了和你一样的错误。

实际上,Visual 在您的代码中有两件事不喜欢:

  1. N 不是编译时间常数(这是对的,不是吗?)。
  2. 然后问题是参考编译时间常数。因此,您应该在所有模板参数中将“T& n”替换为“T n”。

这让我有了这份工作!

于 2013-01-04T15:39:32.417 回答
0

您应该只用普通变量(T n而不是T& n)替换引用。

于 2013-08-07T07:36:31.137 回答