编辑:根据 Mike Seymour 的评论,我相应地替换operator std::string () const;
并operator char * () const;
更改了实现。这允许隐式转换,但由于某种原因,unsigned long int 运算符优先于 char * 运算符,这感觉不太对……另外,我不想在外部暴露像 char * 这样讨厌的 C 东西类,当我有 std::string 时。我有一种预感,我的 CustomizedInt 类需要从某些东西继承以支持我想要的功能。有人可以详细说明迈克的评论std::basic_string
吗?我不确定我是否理解正确。
我有这段代码:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int () const;
operator std::string () const;
};
CustomizedInt::operator unsigned long int () const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string () const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
打印“调用运算符 unsigned long int; 123”。我的问题是:
- 删除运算符 unsigned long int 后,为什么需要将 x 显式转换为 std::string?为什么它不直接调用隐式转换运算符(std::string)?
- 是否有任何文档解释允许哪些隐式转换以及它们的优先顺序?似乎如果我将运算符 unsigned int 与运算符 unsigned long int 一起添加到此类,我会收到有关 << 运算符歧义的编译器错误...
- 另外,我知道定义这样的运算符可能是不好的做法,但我不确定我是否完全理解相关的警告。有人可以概述一下吗?只定义公共方法 ToUnsignedLongInt 和 ToString 会更好吗?