2011-05-25 73 views
2

我无法找出放置我创建的重载运算符的位置。他们是否应该在他们经营的课堂上,还是在课堂上?这两种方式都给我带来麻烦。任何指针都会很棒。运算符超载C++放置

这是我非常基本的uint128_t类:

class uint128_t{ 
    private: 
     uint64_t UPPER, LOWER; 

    public: 
    // constructors 
     uint128_t(){ 
      UPPER = 0; 
      LOWER = 0; 
     } 

     template <typename T> 
     uint128_t(T val){ 
      UPPER = 0; 
      LOWER = (uint64_t) val; 
     } 

     template <typename S, typename T> 
     uint128_t(const S & upper_val, const T & lower_val){ 
      UPPER = (uint64_t) upper_val; 
      LOWER = (uint64_t) lower_val; 
     } 

     uint128_t(uint128_t val){ 
      UPPER = val.upper(); 
      LOWER = val.lower(); 
     } 

     uint64_t upper(){ 
      return UPPER; 
     } 

     uint64_t lower(){ 
      return LOWER; 
     } 
}; 

如果运营商都在类,他们工作得很好。但是,我可以做uint128_t^uint32_t但不是uint32_t^uint128_t。另一方面,移动外面的所有东西给我error: 'uint128_t operator=(uint128_t, T)' must be a nonstatic member function。另外,运营商=不会为明显的常量输入工作,因为值是ULLL,这不存在,除非有人知道这样做的方式。

我该怎么办?

+0

这个编译?它不应该。你的拷贝构造函数是非法的。它通过值来接受参数,但这是不可能的,因为除非已经有复制构造函数,否则不能通过值传递参数。它应该通过const引用来接受它的参数。实际上,你甚至不应该定义它,因为在这种情况下默认的拷贝构造函数可以正常工作。 – 2011-05-25 04:06:02

回答

1

为什么不是两者的混合? 把operator =放在里面,其余的放在里面。

对于那些将uint128_t作为左手边参数的人并不重要,如果它是右手边的参数,那么它必须是全局函数。所以出于这个原因,如果它们是全球性的,你可以将两个功能并排放置。你甚至可以逃脱一个聪明的宏来为两者实现一个实现,如果仅仅是交换的实现。

+0

我想我会把外面的rhs功能。你能否回答关于这个问题的另一个问题?虐待创建一个新的线程 – calccrypto 2011-05-25 03:53:12

0

一般来说,最好把它们放在外面等了class X和一个隐含的构造从Y型,单一功能operator+(X&, const X&)让您x + yy + x加入X和Y的鼻翼。如果您可以看到并且希望 - 使x + y和/或y + x快于x + x,那么您可能需要单独的函数。需要注意的一点是:通过operator+=成员函数实现+通常是好事,在执行rhs的+=之后返回lhs的临时副本(左侧值)....