2016-07-30 22 views
7

Mapped_type bir şablon sınıfının iç sınıfı olan bir std :: map bildirmek için doğru sözdizimi ile ilgili yardım istemek istiyorum.Şablon sınıfı 'iç sınıfın eşleştiricisi için doğru sözdizimi?

Lütfen aşağıdaki kodu # if/# else bloğunda bulabilirsiniz. "#if 1" bloğu, iç sınıfı İç olan dış sınıf şablon sınıfına sahiptir. Dış, mapped_type Inner türünde bir std haritasını alan Func işlevini tanımlar.

#include <map> 

#if 1 
template<typename C, typename T> 
class Outer 
{ 
    public: 
     Outer(const C& c, const T& t){} 
     virtual ~Outer(){} 

     class Inner 
     { 
      public: 
       Inner(){} 
       Inner(T t){} 
       virtual ~Inner(){} 

      protected: 
       T mT; 
     }; 

     void Func(std::map<C, Inner>& rMap); 

    protected: 
     std::map<C, Inner> mMap; 
}; 

template<typename C, typename T> 
void Outer<C, T>::Func(std::map<C, Outer::Inner>& rMap) 
{ 
    std::map<C, Inner>::iterator iter; 

    for (iter = rMap.begin(); iter != rMap.end(); ++iter) 
    { 
     mMap[iter->first] = iter->second; 
    } 
} 

#else 

class Outer 
{ 
    public: 
     Outer(const int& i, const double& d){} 
     virtual ~Outer(){} 

     class Inner 
     { 
      public: 
       Inner() : mD(0){} 
       Inner(const double d) : mD(d){} 
       virtual ~Inner(){} 

      protected: 
       double mD; 
     }; 

     void Func(std::map<int, Inner>& rMap); 

    protected: 
     std::map<int, Inner> mMap; 
}; 

void Outer::Func(std::map<int, Inner>& rMap) 
{ 
    std::map<int, Inner>::iterator iter; 

    for (iter = rMap.begin(); iter != rMap.end(); ++iter) 
    { 
     mMap[iter->first] = iter->second; 
    } 
} 

#endif 

int main() 
{ 
    return 0; 
} 

Derleme bu hat yani std :: map Yineleyici ilanından en Dış :: Func (...) başarısız:

std::map<C, Inner>::iterator iter; 

denedim ama bilemiyorum ne kod satırında yanlıştır.

Karşılaştırma/karşıtlık için "#else" bloğu, benzer nitelikte şablon olmayan kod içerir. Bu kod derleniyor.

derleme hatası ve g ++ sürüm şunlardır:

>g++ main.cpp 
main.cpp: In member function ‘void Outer<C, T>::Func(std::map<C, Outer<C, T>::Inner, std::less<_Key>, std::allocator<std::pair<const C, Outer<C, T>::Inner> > >&)’: 
main.cpp:31: error: expected ‘;’ before ‘iter’ 
main.cpp:33: error: ‘iter’ was not declared in this scope 

>g++ --version 
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11) 
Copyright (C) 2010 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

herhangi bir yardım için teşekkür ederiz.

+0

'typename std :: harita :: iterator iter; – nshct

+0

Olası yinelenen [Nerede ve neden" şablon "ve" typename "anahtar sözcüklerini koymak zorundayım?] (Http://stackoverflow.com/questions/610245/nerede-ve-neden-it-koymak-the-şablon-ve-typename-anahtar kelimeler) – Oktalist

cevap

9

Inner, Owner<C, T> dizinindeyse, bu bir dependent name olur. Bu, std::map<C, Inner>'un bir üyesi olan iterator tanımlayıcısına neden olarak, bağımsız bir ad olmaktır.

Bu kurallara göre, anahtar kelime typename kullanmak için zorlar:

typename std::map<C, Inner>::iterator iter; 
~~~^~~~~ 

derleyici öyle değil beri sınıfının içindeki bazı yapılar ne anlama geldiğini emin olamaz Bunun nedeni henüz kesin C için kullanılan tip ve T biliyoruz: şablon tanımına (sınıf şablonu ve işlevi şablon hem de) içinde

anlamı o Bazı yapılar bir örneklemden diğerine farklılık gösterebilir. Özellikle, türler ve ifadeler, tip şablon parametrelerinin türlerine ve tip olmayan şablon parametrelerinin değerlerine bağlı olabilir.

typename anahtar sözcüğü, derleyiciye, erişmekte olduğunuz simgenin gerçekten bir takma ad/tür olduğunu bildirmek için kullanılır.

+1

Orada olan bilgelik yazıya hayran kalmaya devam ediyorum. Teşekkür ederim. – StoneThrow

+0

Dürüst olmak gerekirse, not ettiğiniz bağlantıdaki açıklama başımın üstüne çıktı. Bu senaryoya aşina iseniz, bunu daha basit bir şekilde açıklayabilir misiniz? "Typename anahtar sözcüğü, derleyiciye erişmekte olduğunuz simgenin gerçekten bir takma ad/tür" olduğunu söylerken, bu bağlamda "sembol" nedir? İç sınıf mı? Açıklamanın ayrıştırılmasına dayanarak, bu durumun bu durum için neden gerekli olduğu (iç sınıflar), ancak “içsel olmayan” sınıflar için gerekli olmadığı belirsiz. Daha derin bir açıklamanız varsa takdir edin, ancak endişelenmeyin. Teşekkür ederim. – StoneThrow

İlgili konular