gpt4 book ai didi

c++ - 隐式转换运算符

转载 作者:行者123 更新时间:2023-11-30 02:02:00 25 4
gpt4 key购买 nike

我想使用 C++11 的可变参数模板功能打印函数的所有参数。我做了以下事情:

struct concatenate
{

template< typename ...ARGS >
explicit
concatenate(ARGS const & ...args)
{
cat(args...);
}

/*explicit*/
operator std::string const () const
{
return oss.str();
}

private :

std::ostringstream oss;

void cat() const
{ ; }

template< typename T, typename ...ARGS >
void cat(T const & head, ARGS const & ...tail)
{
if (oss.tellp() > 0) {
oss << ' ';
}
oss << head;
cat(tail...);
}

};

然后我尝试测试一下:

std::cout << '\'' << concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f) << '\'' << std::endl;

但随后给出的代码没有编译错误:

error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
c:\mingw\lib\gcc\mingw32\4.7.0\include\c++\ostream:600: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = concatenate]'

错误的性质是什么?毕竟,编译器别无选择,只能使用转换运算符。不是吗?

最佳答案

operator << for class template std::basic_string 定义为(自由)函数模板。与非模板函数相比,模板参数推导不涉及可能的参数转换。 basic_string 的模板化运算符 << 恰好需要一个字符串,因为它是正确的参数,隐式转换(从连接到字符串)不起作用。

关于c++ - 隐式转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13628893/

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