2010-12-31 14 views
19

Bazı statik şablon yöntemlerine sahip 2 adet şablon olmayan A, B sınıfı vardır.Hata: iç içe ad belirtecinde kullanılan eksik tür belirteci

B sınıfından A sınıfından statik yöntem A'dan B statik yöntem denir ve denir. sadece açıklama (gerçek değil kodu) için kaynak kodu ...

A.h

#include "B.h" 
class A 
{ 
public: 
    template <class T> 
    void f1() 
    { 
     T var1= ...; 
     T var2 = B::f4(T); 
    } 

    template <class T> 
    T f2() 
    { 
     return ... 
    } 
}; 

#include "A.h" 
class B 
{ 
public: 
    template <class T> 
    void f3() 
    { 
     T var1= ...; 
     T var2 = A::f2(T); //Error 
    } 

    template <class T> 
    T f4() 
    { 
     return ... 
    } 
}; 

Ben NetBeans g ++ derleyici ile sorun yaşıyorum. Derleme sırasında aşağıdaki hata oluşuyor: Hata: iç içe ad belirticide kullanılan tamamlanmamış A tipi, g ++.

Her iki sınıfa da ileri bildirim eklemeyi denedim, ancak hiçbir şey başarılı olmadı.

http://gcc.gnu.org/ml/gcc-bugs/2005-02/msg01383.html

cevap

0

Senin sorunun dairesel başlık bağımlılık geçerli:

eski hata vardır.

+29

Ve çözüm ...? –

+1

İndirmeyi reddedenlerin neye karşı olduklarını belirtmeleri gerekir. Çünkü OP sorununa doğru bir cevap. OP, yuvarlak başlık bağımlılıklarının nasıl çözüleceğini açıklamayı istemedi, her kitapta bu önemsizlikler açıklandı. –

+0

http://stackoverflow.com/help/how-to-answer – peetonn

7

Başlık dosyalarınız arasında dairesel bir bağımlılık var. dersleriniz kadar sıkı iç içe olduğundan, bu gibi yapılandırılmış, tek başlık dosyası içine birleşmesini öneririm:

Gerçekten yapmaz hangi (A ve B için ayrı başlık dosyaları kullanmakta ısrar ederse
class A 
{ 
public: 
    template <class T> 
    void f1(); 
}; 

class B 
{ 
    ... 
}; 

template <class T> 
void A::f1() 
{ 
    // Use full definition of class B 
} 

Birbirleri dahil olduktan sonra herhangi bir fark), başlıkları biri diğerini içermeyecek şekilde yeniden yapılandırmanız gerekir, böylece bağımlı şablon işlevlerinden en az birinin ayrı bir dosyada tanımlanması gerekir. Örneğin: döngüsel bir bağımlılık var

// File "a_no_b.h" 
class A 
{ 
public: 
    template <typename T> 
    void f1(); 
}; 

// File "b_no_a.h" 
class B 
{ 
public: 
    template <typename T> 
    void f3(); 
}; 

// File "a.h" 
#include "a_no_b.h" 
#include "b_no_a.h" 

template <typename T> 
void A::f1() 
{ 
    // Use full definition of class B 
} 

// File "b.h" 
#include "b_no_a.h" 
#include "a_no_b.h" 

template <typename T> 
void B::f3() 
{ 
    // Use full definition of class A 
} 
+0

Teşekkürler, iyi çalışıyor. Her ikisinin de sınıf bildirimlerinden önce direktiflerim vardı ... – Ian

4

Çünkü, dikkatli üye fonksiyonları tanımlanır önce her ikisinin de ilan böylece sınıflar A ve B bildirimleri düzenlemek gerekir. İşte

A.h: İşte

#ifndef A_H 
#define A_H 1 
class A 
{ 
public: 
    template <class T> 
    void f1(); 

    template <class T> 
    T f2(); 
}; 

#include "B.h" 

template <class T> 
void A::f1() 
{ 
    T var1= ...; 
    T var2 = B::f4(T); 
} 

template <class T> 
T A::f2() 
{ 
    return ... 
} 

#endif 

B.h geçerli:

Bu yaklaşımla
#ifndef B_H 
#define B_H 1 
class B 
{ 
public: 
    template <class T> 
    void f3(); 

    template <class T> 
    T f4(); 
}; 

#include "A.h" 

template <class T> 
void B::f3() 
{ 
    T var1= ...; 
    T var2 = A::f2(T); 
} 

template <class T> 
T B::f4() 
{ 
    return ... 
} 

#endif 

, sen A.h veya B.h birinci ve bir sorun yok ya dahil etmek mümkün olacak.

+0

Teşekkürler, iyi çalışıyor. Her ikisinin de sınıf beyannamelerinden önce direktifleri dahil ettim ... – Ian