Tôi muốn yêu cầu trợ giúp với cú pháp chính xác để khai báo std :: map có mapped_type là một lớp bên trong của một lớp mẫu.Cú pháp chính xác cho trình vòng lặp bản đồ của lớp bên trong của lớp mẫu?
Vui lòng tìm trong mã bên dưới khối # if/# else. Khối "#if 1" có lớp mẫu Bên ngoài chứa lớp bên trong Bên trong. Hàm Outer định nghĩa Func có một bản đồ std có mapped_type là kiểu Inner.
#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;
}
Compilation thất bại trong Outer :: Func (...) tại các khai báo của iterator std :: bản đồ, tức là dòng này:
std::map<C, Inner>::iterator iter;
tôi đã cố gắng nhưng không thể tìm ra những gì sai với dòng mã.
Để so sánh/tương phản, khối "#else" chứa mã không có mẫu có tính chất tương tự. Mã này biên dịch.
Các lỗi biên dịch và phiên bản g ++ là:
>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.
Cảm ơn bạn đã giúp đỡ nào.
'typename std :: map :: iterator iter;' –
nshct
Có thể trùng lặp [Tại sao và tại sao tôi phải đặt từ khóa "template" và "typename"?] (Http://stackoverflow.com/questions/610245/where-and-why-do-i-có-to-put-the-template-và-typename-keywords) – Oktalist