gpt4 book ai didi

gcc - C++中元组的递归打印

转载 作者:行者123 更新时间:2023-12-02 03:35:55 25 4
gpt4 key购买 nike

有几个关于如何打印 tuple 的建议.下面的片段再现了 Kenny 在 overloading operator << for std::tuple - possible simplications? 中的回答。 .

#include <iostream>
#include <tuple>
#include <type_traits>

// template <typename... T>
// std::ostream& operator<<(std::ostream& os, const std::tuple<T...>& tup);

template <size_t n, typename... T>
typename std::enable_if<(n >= sizeof...(T))>::type
print_tuple(std::ostream&, const std::tuple<T...>&)
{}

template <size_t n, typename... T>
typename std::enable_if<(n < sizeof...(T))>::type
print_tuple(std::ostream& os, const std::tuple<T...>& tup)
{
if (n != 0)
os << ", ";
os << std::get<n>(tup);
print_tuple<n+1>(os, tup);
}

template <typename... T>
std::ostream& operator<<(std::ostream& os, const std::tuple<T...>& tup)
{
os << "[";
print_tuple<0>(os, tup);
return os << "]";
}

int
main()
{
auto t = std::make_tuple(1, std::make_tuple(2, 3));
std::cout << t << std::endl;
}

我的问题是它不能与带有元组的元组的 clang (3.5) 一起正常工作(尽管 gcc 4.9 很高兴):

clang++-mp-3.5 -std=c++11 print.cc 
print.cc:19:10: error: call to function 'operator<<' that is neither visible in the
template definition nor found by argument-dependent lookup
os << std::get<n>(tup);
^
print.cc:20:7: note: in instantiation of function template specialization
'print_tuple<1, int, std::__1::tuple<int, int> >' requested here
print_tuple<n+1>(os, tup);
^
print.cc:27:7: note: in instantiation of function template specialization
'print_tuple<0, int, std::__1::tuple<int, int> >' requested here
print_tuple<0>(os, tup);
^
print.cc:35:19: note: in instantiation of function template specialization
'operator<<<int, std::__1::tuple<int, int> >' requested here
std::cout << t << std::endl;
^
print.cc:24:19: note: 'operator<<' should be declared prior to the call site
std::ostream& operator<<(std::ostream& os, const std::tuple<T...>& tup)
^

如果我取消注释 operator<< 的前向声明在元组上,它有效。但是,它不太适合您不强制定义 operator<< 的框架。对于元组,但让用户选择将其绑定(bind)到 print_tuple : 她必须在 之前转发声明函数,包括定义 print_tuple 的 header .

我不太明白这里发生了什么:在模板中,clang 似乎拒绝使用定义在模板定义点之后之前定义的函数 实例化点。我原以为重要的是实例化点。

反过来说,为什么GCC接受呢?其中一个编译器错了吗?让用户选择定义此 operator<< 的最佳方式是什么? , 它是否递归地正常工作?

谢谢。

最佳答案

您可以在此处了解 clang 未编译它的原因:http://clang.llvm.org/compatibility.html#dep_lookup .看起来 clang 的行为是符合标准的。

要修复它,您可以定义 operator<<namespace std使依赖于参数的查找正常工作。 实际上这可能是未定义的行为,因为它不符合向 std 添加内容的要求。 .

关于gcc - C++中元组的递归打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23469942/

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