模板 class' 内部 class 的映射迭代器的正确语法?
Correct syntax for map iterator of template class' inner class?
我想寻求帮助以正确的语法来声明 std::map,其 mapped_type 是模板 class 的内部 class。
请在下面的代码中找到#if/#else 块。 “#if 1”块具有包含内部 class 内部的模板 class 外部。 Outer 定义函数 Func,该函数采用 mapped_type 类型为 Inner.
的 std 映射
#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;
}
Outer::Func(...) 在 std::map 迭代器的声明处编译失败,即这一行:
std::map<C, Inner>::iterator iter;
我试过了,但无法弄清楚这行代码有什么问题。
对于comparison/contrast,“#else”块包含类似性质的非模板代码。此代码编译。
编译错误和g++版本为:
>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.
感谢您的帮助。
由于 Inner
是您的模板 Owner<C, T>
的成员,它变成了 dependent name。这导致标识符 iterator
(在本例中是 std::map<C, Inner>
的成员)也成为从属名称。
根据规则,这会强制您使用关键字 typename
:
typename std::map<C, Inner>::iterator iter;
~~~^~~~~
这是因为编译器无法确定 class 中的某些结构的含义,因为它还不知道用于 C
和 T
的确切类型:
Inside the definition of a template (both class template and function template), the meaning of some constructs may differ from one instantiation to another. In particular, types and expressions may depend on types of type template parameters and values of non-type template parameters.
typename
关键字用于告诉编译器你访问的符号确实是一个类型别名/类型。
我想寻求帮助以正确的语法来声明 std::map,其 mapped_type 是模板 class 的内部 class。
请在下面的代码中找到#if/#else 块。 “#if 1”块具有包含内部 class 内部的模板 class 外部。 Outer 定义函数 Func,该函数采用 mapped_type 类型为 Inner.
的 std 映射#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;
}
Outer::Func(...) 在 std::map 迭代器的声明处编译失败,即这一行:
std::map<C, Inner>::iterator iter;
我试过了,但无法弄清楚这行代码有什么问题。
对于comparison/contrast,“#else”块包含类似性质的非模板代码。此代码编译。
编译错误和g++版本为:
>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.
感谢您的帮助。
由于 Inner
是您的模板 Owner<C, T>
的成员,它变成了 dependent name。这导致标识符 iterator
(在本例中是 std::map<C, Inner>
的成员)也成为从属名称。
根据规则,这会强制您使用关键字 typename
:
typename std::map<C, Inner>::iterator iter;
~~~^~~~~
这是因为编译器无法确定 class 中的某些结构的含义,因为它还不知道用于 C
和 T
的确切类型:
Inside the definition of a template (both class template and function template), the meaning of some constructs may differ from one instantiation to another. In particular, types and expressions may depend on types of type template parameters and values of non-type template parameters.
typename
关键字用于告诉编译器你访问的符号确实是一个类型别名/类型。