gpt4 book ai didi

通用模板 ostream << 运算符的 C++ 不明确重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:16 27 4
gpt4 key购买 nike

这个问题紧接我之前的问题:Generic operator<< ostream C++ for stringifiable class我想在哪里实现一个通用的 <<ostream适用于拥有 to_str() 的任何类的运算符方法。

我已经成功地检查了一个类是否实现了 to_str()方法与用途std::cout << stringify(a)感谢这个answer .但是,我在编写模板时遇到困难 ostream<<运营商制作std::cout << a有效。

以下测试代码:

#include <iostream>
#include <sstream>
#include <string>

template<class ...> using void_t = void;

template<typename T, typename = void>
struct has_to_string
: std::false_type { };

template<typename T>
struct has_to_string<T,
void_t<decltype(std::declval<T>().to_str())>
>
: std::true_type { };

template<typename T> std::enable_if_t<has_to_string<T>::value, std::string>
stringify(T t) {
return t.to_str();
}

template<typename T> std::enable_if_t<!has_to_string<T>::value, std::string>
stringify(T t) {
return static_cast<std::ostringstream&>(std::ostringstream() << t).str();
}

// The following does not work
/*
template<typename T> std::enable_if_t<has_to_string<T>::value, std::ostream&>
operator<<(std::ostream& os, const T& t) {
os << t.to_str();
return os;
}

template<typename T> std::enable_if_t<!has_to_string<T>::value, std::ostream&>
operator<<(std::ostream& os, const T& t) {
os << t;
return os;
}
*/

struct A {
int a;
std::string to_str() const { return std::to_string(a); }
};

struct B {
std::string b;
std::string to_str() const { return b; }
};

int main() {
A a{3};
B b{"hello"};
std::cout << stringify(a) << stringify(b) << std::endl; // This works but I don't want to use stringify
// std::cout << a << b << std::endl; // I want this but it does not work
}

给出与原始问题相同的错误。我做错了什么?

最佳答案

当类型为 std::string 时,您会得到一个不明确的 'operator<< 重载错误,因为代码中的模板化版本与 ostream header 中提供的版本具有相同的优先级。

您可以通过更改测试程序来检查这是否是问题的根源:

int main() {
std::cout << std::string("There is your problem") << std::endl;
}

你仍然会看到同样的错误。

要解决这个问题,您可以添加一个 operator<< 的显式定义,它将优先于两个冲突的模板。

std::ostream& operator<<(std::ostream& os, const std::string& t) {
using std::operator<<;
os << t;
return os;
}

关于通用模板 ostream << 运算符的 C++ 不明确重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30531429/

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