gpt4 book ai didi

c++ - 为什么clang拒绝可变参数模板 friend 功能

转载 作者:IT老高 更新时间:2023-10-28 23:21:39 24 4
gpt4 key购买 nike

我有以下示例代码,简化为基本代码,可使用 gcc 6.1、gcc 7.0 head 和 Visual Studio 2015/2017RC 编译,但不能使用任何 clang 版本。

#include <iostream>
#include <tuple>

using namespace std;

namespace outer {
namespace test {

template <typename A, typename B, typename...C>
auto bar_(A&&, B&&, C&&... c) {
return std::make_tuple(c._p...);
}

}

template <typename A, typename B, typename...C>
auto bar(A a, B b, C&&... c) {
return test::bar_(std::move(a), std::move(b), std::forward<C>(c)...);
}

template<typename T>
class foo
{
template <typename A, typename B, typename...C>
friend auto test::bar_(A&&, B&&, C&&... c);

int _p;
public:
foo(int f) : _p(f) {}
};
}

int main() {
outer::foo<int> a1(1);
outer::foo<int> a2(2);

auto result = outer::bar(2.3, 4.5, a1, a2);
cout << get<0>(result) << " " << get<1>(result) << '\n';

return 0;
}

clang 告诉我:prog.cc:12:34:错误:'_p' 是 'outer::foo' 的私有(private)成员 返回 std::make_tuple(c._p...);

我不明白为什么 clang 不识别 friend 声明。这是clang的错误还是所有其他编译器的问题?

当我将 foo 设为非模板类​​时,clang 不会提示。任何解决方法的想法?

在此先感谢

最佳答案

作为“为什么?”问题在 this thread 中进行了深入讨论我将只关注一种可能的解决方法。您可以尝试将您的函数包装到一个虚拟结构中,以确保它的所有可能重载也包含在您的 foo 的 friend 列表中。解决方法建议如下所示:

#include <iostream>
#include <tuple>

using namespace std;

namespace outer {
namespace test {

struct wrapper{
template <typename A, typename B, typename...C>
static auto bar_(A&&, B&&, C&&... c) {
return std::make_tuple(c._p...);
}
};

}

template <typename A, typename B, typename...C>
auto bar(A a, B b, C&&... c) {
return test::wrapper::bar_(std::move(a), std::move(b), std::forward<C>(c)...);
}

template<typename T>
class foo
{
friend struct test::wrapper;

int _p;
public:
foo(int f) : _p(f) {}
};
}

int main() {
outer::foo<int> a1(1);
outer::foo<int> a2(2);

auto result = outer::bar(2.3, 4.5, a1, a2);
cout << get<0>(result) << " " << get<1>(result) << '\n';

return 0;
}

[live demo]

关于c++ - 为什么clang拒绝可变参数模板 friend 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724848/

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