ฟังก์ชันเทมเพลตภายในคลาสเทมเพลต


119

ฉันมีรหัสนี้:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo() {
            U a;
            a.invoke();
        }
};

ฉันต้องการในรูปแบบนี้:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo();
};

template <class T> /* ????? */
void MyClass<T>::foo() {
    U a;
    a.invoke();
}

ฉันจะทำสิ่งนี้ได้อย่างไร? ไวยากรณ์ที่ถูกต้องคืออะไร?


ทำไมไม่ทำเพียงแค่ลดฟังก์ชันภายในคลาสปฏิเสธ (ดูcodepad.org/wxaZOMYW ) คุณไม่สามารถย้ายฟังก์ชันปฏิเสธออกจากส่วนหัวได้ดังนั้น ...
hiobs

@hiobs: FWIW คุณสามารถย้ายการประกาศไปยังไฟล์ CPP ที่กล่าวว่าฉันได้ทำสิ่งนี้เพียงครั้งเดียวเพื่อทำการแฮกเกอร์ ในกรณีนี้การรู้วิธีทำจึงเป็นสิ่งสำคัญ
Thomas Eding

บางครั้งเราต้องย้ายนิยามฟังก์ชันออกไปนอกคลาสหลังจากนิยามของการอ้างอิงที่ต้องการโดยตัวฟังก์ชัน สิ่งนี้เกิดขึ้นเมื่อคลาส A ใช้คลาส B และ B ก็ใช้ A ในกรณีนั้นคุณประกาศ A และ B จากนั้นกำหนดวิธีการ A และ B
Wheezil

คำตอบ:


180

เขียนสิ่งนี้:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }

เป็นโมฆะ MyClass <T> :: foo <T> () ... ขอบคุณฉันลองมาก่อน แต่มันไม่ได้ผลสำหรับฉัน .. บางทีฉันอาจต้องทำโปรเจ็กต์ที่สะอาด
Michael

@ user1074367: ไม่ฉันคิดว่ามันเป็นอย่างที่ฉันพูด
Kerrek SB

3
ที่จริงฉันเขียน: template <class T> template <class U> โมฆะ MyClass <T> :: foo () {U a; a.invoke (); } และได้ผล
Michael

11
@ user1074367: เอ่อ ... ใช่นั่นคือสิ่งที่ฉันพูดในคำตอบไม่ใช่?
Kerrek SB

8
@mike: เทมเพลตสมาชิกเป็นเรื่องปกติและธรรมดา
Kerrek SB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.