Ten kod nie kompiluje się w Clang (6,7,8,9, trunk), ale dobrze się kompiluje w 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 mówi mi:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
... co oczywiście jest, ale staram się tego członka dostępem od wewnątrz tej samej klasy. Nie rozumiem, dlaczego nie powinno być tam dostępne. Czy trafiłem (i powinienem zgłosić) błąd Clanga?
Możesz bawić się kodem w eksploratorze kompilatorów Godbolt .
Outer<42>
, a nie main
- prawda? Wygląda mi jeszcze bardziej jak błąd.
std::result_of
zamiast tego działa praca?
friend int main();
powstrzymuje Clanga od narzekań.