首页 > 解决方案 > 访问检查如何在类型别名模板中工作?

问题描述

考虑这段代码:

struct A
{
    template <typename T>
    using type = decltype(&T::foo);
};

class B
{
    void foo() {}
    friend A;
};

int main()
{
    A::type<B> x;
}

> Run on gcc.godbolt.org <

它在 GCC 和 MSVC 上编译,但让 Clang 抱怨:error: 'foo' is a private member of 'B'.

它是一个 Clang 错误吗?我该如何解决这个问题?


编辑:副本不提供解决方法,所以这里是一个。

struct A
{
    template <typename T>
    static decltype(&T::foo) helper();

    template <typename T>
    using type = decltype(helper<T>());
};

class B
{
    void foo() {}
    friend A;
};

int main()
{
    A::type<B> x;
}

标签: c++language-lawyer

解决方案


推荐阅读