Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;操作数到标准运算符的隐式转换 我在理解C++使用隐式转换的条件时遇到了一些困难。假设我有一门课: class SomeClass { private: int val; public: SomeClass(int i) :val{ i } {} operator string() { return to_string(val); } };_C++_Visual C++_Operators_Implicit Conversion - Fatal编程技术网

C++;操作数到标准运算符的隐式转换 我在理解C++使用隐式转换的条件时遇到了一些困难。假设我有一门课: class SomeClass { private: int val; public: SomeClass(int i) :val{ i } {} operator string() { return to_string(val); } };

C++;操作数到标准运算符的隐式转换 我在理解C++使用隐式转换的条件时遇到了一些困难。假设我有一门课: class SomeClass { private: int val; public: SomeClass(int i) :val{ i } {} operator string() { return to_string(val); } };,c++,visual-c++,operators,implicit-conversion,C++,Visual C++,Operators,Implicit Conversion,为什么在将此类与运算符一起使用时,我需要强制转换为字符串?为什么它不隐式地执行转换呢 代码: int main(无效) { 某些类别sc=4; coutstd::cout不接受std::string 它接受模板化的std::basic_字符串,其参数将被推导。 有关更多详细信息,请参阅 我们考虑下面的例子: #include<string> struct SomeClass { operator std::string() { return ""; } }; templa

为什么在将此类与运算符一起使用时,我需要强制转换为字符串?为什么它不隐式地执行转换呢

代码:

int main(无效)
{
某些类别sc=4;

cout
std::cout
不接受
std::string

它接受模板化的
std::basic_字符串
,其参数将被推导。
有关更多详细信息,请参阅

我们考虑下面的例子:

#include<string>

struct SomeClass {
    operator std::string() { return ""; }
};

template <class CharT, class Traits, class Allocator>
void f(const std::basic_string<CharT, Traits, Allocator> &) {}

template <class CharT, class Traits, class Allocator>
void f(std::basic_string<CharT, Traits, Allocator> &) {}

int main(void) {
    SomeClass sc{};
    f((std::string)sc);
    //f(sc);
}
#包括
结构类{
运算符std::string(){return”“;}
};
模板
void f(const std::basic_string&){
模板
void f(std::basic_string&){
内部主(空){
SomeClass-sc{};
f((标准::字符串)sc);
//f(资深大律师);
}
这与您的情况类似。
当然,
f(sc)
编译的原因几乎相同

问题是,要推断模板参数
SomeClass
应该转换为
std::string
。要将其转换为
std::string
,编译器应该猜测存在有效的重载并尝试使用它。无论如何,从模板参数的角度来看,这样一个可行的函数并不存在仍然需要推导ters,为了推导ters,编译器应该猜测在强制转换之后,
SomeClass
的重载存在。它不能,因为……等等


<>我还没有检查过,但我敢打赌,类似的东西也适用于<代码>运算符+<代码> > .< /p> ,当你写“代码> cOUT时,它会被使用,以便更兼容C++标准库函数(没有强制转换)。我应该对<代码> Basic字符串S/<代码>进行隐式转换,而不是String。@ ApOrVaKaHARCHNO,<代码> String 是一个特定的实例化的代码:<代码> Basic字符串Stry< /C> >,是否<代码>操作程序,那么,更兼容C++标准库函数(没有强制转换)。,我应该写到
basic_string
的隐式转换,而不是string?在这个答案之后不久,编辑历史让它看起来像是你基本上复制了我的,但是编辑历史误导了我。你发布了一个错误的答案,当你意识到这一点时删除了它,并最终修复了它。最后,我们只是简单地发布了same同时回答。如果这恰好是有人否决的原因,请让该人恢复否决票。@hvd确切地说,我们在同一时间发布了或多或少两个相同的答案,当然,我的答案是以前发布的错误答案的编辑。:-…无论如何,别担心,伤害我的不是否决票,而是错误答案事实上,它没有被解释,如果我不知道读者出了什么问题,我就无法改进答案。
#include<string>

struct SomeClass {
    operator std::string() { return ""; }
};

template <class CharT, class Traits, class Allocator>
void f(const std::basic_string<CharT, Traits, Allocator> &) {}

template <class CharT, class Traits, class Allocator>
void f(std::basic_string<CharT, Traits, Allocator> &) {}

int main(void) {
    SomeClass sc{};
    f((std::string)sc);
    //f(sc);
}
template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>&
    operator<<(std::basic_ostream<CharT, Traits>& os,
               const std::basic_string<CharT, Traits, Allocator>& str);