在下面(最小化)代码中,我有一个公共using声明,它指的是decltype(something_private):using Foo = decltype(something_private<T>)。
关于Clang,但不是GCC,因为它是私密的,所以没有编译。
问题:
func<T>()公开。以下代码在Clang (3.9 - 7.0)上出错,但基于GCC (4.8.4 - 8.2):
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输出:
<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发布于 2018-10-19 02:14:31
我还没有看过引文的标准,但给你找个解决办法。因为这很管用,它让我觉得clang只是有个bug。当函数直接在A中时,它将类型别名视为调用者的上下文中的类型别名,但是将函数移到结构中可以解决这个问题。嗯。我最近做了很多g++ / clang移植,虽然我没有遇到这种情况,但它闻起来有些东西是我遇到的。
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;
}更新:新增引文。
我认为这直接回答了你的问题,而这种响声在这里是错误的。
N4778 (最近我发现),10.8/p4 (第259页)。[注意:由于访问控制适用于名称,因此如果访问控制应用于ty胡枝子名称,则只考虑typedef名称本身的可访问性。不考虑ty胡枝子所引用的实体的可访问性。
https://stackoverflow.com/questions/52884807
复制相似问题