이 코드는 Clang (6,7,8,9, 트렁크)에서 컴파일되지 않지만 GCC (7.1, 8.1, 9.1)에서는 잘 컴파일됩니다.
template<class T> struct TypeHolder { using type = T; };
template<int i>
class Outer {
private:
template<class T>
static constexpr auto compute_type() {
if constexpr (i == 42) {
return TypeHolder<bool>{};
} else {
return TypeHolder<T>{};
}
}
public:
template<class T>
using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};
int main() {
Outer<42>::TheType<int> i;
}
Clang은 나에게 말한다 :
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
… 물론 어떤 클래스 이지만 같은 클래스 내 에서 해당 멤버에 액세스하려고합니다 . 왜 액세스 할 수 없어야하는지 모르겠습니다. Clang 버그를 쳤습니까?
Godbolt의 컴파일러 탐색기 에서 코드를 가지고 놀 수 있습니다 .
이상한! 그러나, 액세스 검사는 확실히의 "권한"을해야한다
—
루카스 바스
Outer<42>
하지 main
못했습니다 -? 지금은 나에게 더 벌레처럼 보인다.
사용 않는
—
브랜든
std::result_of
대신 일을?
FWIW, ICC 및 MSVC에서도 작동합니다.
—
ChrisMM
friend int main();
하면 Clang이 불평하는 것을 막습니다.