รหัสนี้ไม่ได้รวบรวมใน 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;
}
เสียงดังกราวด์บอกฉัน:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
... แน่นอนว่ามันคืออะไร แต่ฉันพยายามเข้าถึงสมาชิกคนนั้นจากในชั้นเรียนเดียวกัน ฉันไม่เห็นสาเหตุที่ไม่สามารถเข้าถึงได้ ฉันได้กดปุ่ม (และฉันควรจะ) บั๊กเสียงดังกราว
คุณสามารถของเล่นรอบกับรหัสที่Godbolt ของคอมไพเลอร์สำรวจ
ตลก! อย่างไรก็ตามการตรวจสอบการเข้าถึงควรจะทำด้วย "สิทธิ์" ของ
—
Lukas Barth
Outer<42>
ไม่ใช่main
ไหม? กำลังมองหาข้อบกพร่องมากขึ้นสำหรับฉันตอนนี้
ใช้
—
แบรนดอน
std::result_of
งานแทนหรือไม่
FWIW ทำงานใน ICC และ MSVC ด้วย
—
ChrisMM
friend int main();
หยุดเสียงดังกราวจากการบ่น