如何使类定义外的运算符重载优先?

时间:2017-08-24 11:07:39

标签: c++

我定义了以下运营商:

std::vector<uint8_t> &operator<<(std::vector<uint8_t> &bytes, uint8_t b);
std::vector<uint8_t> &operator<<(std::vector<uint8_t> &bytes, uint32_t b);

使用int调用运算符时,出现错误:

/misc.hpp:77:12: error: ambiguous overload for ‘operator<<’ (operand types are ‘std::vector<unsigned char>’ and ‘int’)
     buffer << first;
     ~~~~~~~^~~~~~~~
./misc.hpp:62:23: note: candidate: std::vector<unsigned char>& operator<<(std::vector<unsigned char>&, uint8_t)
 std::vector<uint8_t> &operator<<(std::vector<uint8_t> &bytes, uint8_t b);
                       ^~~~~~~~
./misc.hpp:63:23: note: candidate: std::vector<unsigned char>& operator<<(std::vector<unsigned char>&, uint32_t)
 std::vector<uint8_t> &operator<<(std::vector<uint8_t> &bytes, uint32_t b);

我可以优先使用uint8_t版本,这样我就不需要进行类型转换,例如static_cast<uint8_t>来调用该运算符吗?

1 个答案:

答案 0 :(得分:3)

你可以通过将第二个模板作为模板来破解它:

std::vector<uint8_t> &operator<<(std::vector<uint8_t> &bytes, uint8_t b);

template<class Y>
std::vector<uint8_t> &operator<<(std::vector<uint8_t> &bytes, Y b);

重载决策将始终优先于模板上的非模板功能,因此该技术引入了足够的层次结构。如果你不想要发出大量的Y类型,那么就可以使用Y类型的静态断言。

实际上,int的进一步过载可能是明智之举。