我定义了以下运营商:
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>
来调用该运算符吗?
答案 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
的进一步过载可能是明智之举。