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.
'typename std :: harita :: iterator iter; –
nshct
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