Şablon sınıfı içindeki şablon işlevi


119

Bu koda sahibim:

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

Bunu şu biçimde istiyorum:

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

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

Bunu nasıl yapabilirim? Doğru sözdizimi nedir?


Neden işlev sınıf decl içinde tanımlanmıyor (bkz. Codepad.org/wxaZOMYW )? Fonksiyon
— decl'i

@hiobs: FWIW, beyanı bir CPP dosyasına taşıyabilirsiniz. Bununla birlikte, biraz bilgisayar korsanlığı yapmak için bunu yalnızca bir kez yaptım. Bu durumda, bunun nasıl yapılacağını bilmek önemlidir.
— Thomas Eding

Bazen işlev gövdesi tarafından ihtiyaç duyulan bağımlılıkların tanımlanmasından sonra işlev tanımını sınıfın dışına taşımak gerekir. Bu, A sınıfı B sınıfını ve B de A'yı kullandığında gerçekleşir. Bu durumda, A ve B'yi bildirir, ardından A ve B yöntemlerini tanımlarsınız.
— Wheezil

Yanıtlar:


180

Bunu yaz:

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

void MyClass <T> :: foo <T> () ... teşekkürler, daha önce denedim ama işe yaramıyor .. belki de temiz proje yapmam gerekiyordu.
— Michael

@ user1074367: Hayır, söylediğim gibi olduğunu düşünüyorum.
— Kerrek SB

3
aslında şunu yazdım: şablon <sınıf T> şablon <sınıf U> void Sınıfım <T> :: foo () {U a; a.invoke (); } ve işe yarıyor
— Michael

11
@ user1074367: Err ... evet, cevabımda söylediğim şey bu değil mi?
— Kerrek SB

8
@mike: Üye şablonları tamamen normal ve yaygın bir şeydir.
— Kerrek SB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.