В следующем (свернутом) коде у меня есть публичное объявление using
, которое ссылается на decltype(something_private)
: using Foo = decltype(something_private<T>)
.
В Clang, но не в GCC, это не компилируется, посколькуprivate.
Вопросы:
- Что такое элегантное решение, если я не хочу делать
func<T>()
публичным. - Где в стандарте C ++ (C ++ 11) резервная копия Clang здесь указана правильно?
Приведенный ниже код завершается ошибкой со следующим кодом ошибки на 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;
}
Clang 7.0 output:
<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