首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公共“使用”=解密类型(<private>)

公共“使用”=解密类型(<private>)
EN

Stack Overflow用户
提问于 2018-10-19 01:49:53
回答 1查看 415关注 0票数 12

在下面(最小化)代码中,我有一个公共using声明,它指的是decltype(something_private)using Foo = decltype(something_private<T>)

关于Clang,但不是GCC,因为它是私密的,所以没有编译。

问题:

  1. 什么是优雅的解决方案,如果我不想让func<T>()公开。
  2. 在C++标准(C++11)中,备份Clang在这里是正确的吗?

以下代码在Clang (3.9 - 7.0)上出错,但基于GCC (4.8.4 - 8.2):

代码语言:javascript
复制
class A {
private:
    template <class T>
    static auto func() -> T; // The actual return type is much
       // more complicated, so `using Foo = T` would not work.

public:
    template <class T>
    using Foo = decltype(func<T>());
};

int main(int, char**) {
    A::Foo<int> y;
    return y;
}

Clang7.0输出:

代码语言:javascript
复制
<source>:10:24: error: 'func' is a private member of 'A'
  using Foo = decltype(func<T>());
                       ^~~~~~~

<source>:14:7: note: in instantiation of template type alias 'Foo' requested here
   A::Foo<int> y;
          ^

<source>:6:15: note: declared private here
  static auto func() -> T;
              ^

1 error generated.
Compiler returned: 1

https://godbolt.org/z/zD4Hk5

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-19 02:14:31

我还没有看过引文的标准,但给你找个解决办法。因为这很管用,它让我觉得clang只是有个bug。当函数直接在A中时,它将类型别名视为调用者的上下文中的类型别名,但是将函数移到结构中可以解决这个问题。嗯。我最近做了很多g++ / clang移植,虽然我没有遇到这种情况,但它闻起来有些东西是我遇到的。

代码语言:javascript
复制
class A {
private:
  struct X {
    template <class T>
    static auto func() -> T;
  };

public:
  template <class T>
  using Foo = decltype(X::func<T>());
};

void bar() {
   A::Foo<int> y;
}

https://godbolt.org/z/ozIS-r

更新:新增引文。

我认为这直接回答了你的问题,而这种响声在这里是错误的。

N4778 (最近我发现),10.8/p4 (第259页)。[注意:由于访问控制适用于名称,因此如果访问控制应用于ty胡枝子名称,则只考虑typedef名称本身的可访问性。不考虑ty胡枝子所引用的实体的可访问性。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52884807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档