gpt4 book ai didi

c++ - 为什么编译器不执行类型转换?

转载 作者:可可西里 更新时间:2023-11-01 15:54:24 26 4
gpt4 key购买 nike

考虑以下代码。

#include <iostream>
#include <string>

struct SimpleStruct
{
operator std::string () { return value; }
std::string value;
};

int main ()
{
std::string s; // An empty string.
SimpleStruct x; // x.value constructed as an empty string.

bool less = s < x; // Error here.
return 0;
}

此代码无法在 g++ 或 Microsoft Visual C++ 上编译。编译器给出的错误报告是no match for operator '<' in 's < x' .问题是为什么编译器不简单地转换 SimpleStruct xstring根据给定operator string ()然后使用 operator < ( string, string )

最佳答案

operator<对于 std::string是一个函数模板。重载是:

  template<class charT, class traits, class Allocator>
bool operator< (const basic_string<charT,traits,Allocator>& lhs,
const basic_string<charT,traits,Allocator>& rhs);
template<class charT, class traits, class Allocator>
bool operator< (const basic_string<charT,traits,Allocator>& lhs,
const charT* rhs);
template<class charT, class traits, class Allocator>
bool operator< (const charT* lhs,
const basic_string<charT,traits,Allocator>& rhs);

您的调用与任何可用的重载都不匹配,因此它们都从候选列表中删除。由于没有函数模板被选为解析调用的候选者,因此没有任何东西可以将 SimpleStruct 转换为。

template <class T>
class String
{
};

template <class T>
bool operator< (const String<T>&, const String<T>&) { return true; }


//if a suitable non-template function is available, it can be picked
//bool operator< (const String<char>&, const String<char>&) { return true; }

struct SimpleStruct
{
operator String<char> () { return value; }
String<char> value;
};

int main()
{
String<char> s;
SimpleStruct ss;
s < ss; //the call doesn't match the function template, leaving only the commented-out candidate
}

关于c++ - 为什么编译器不执行类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6788169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com