所以,我正在为一个作业开发一个模板化的 Vector 类,我遇到了一些通过谷歌搜索解决的问题,但我仍然想知道为什么我做错了。第一个问题是我有:
template <typename T>
class Vector
{
...
template <typename T2>
Vector(const Vector<T2> &other);
}
template <typename T, T2>
Vector<T>::Vector(const Vector<T2> &other)
{
...
}
这给了我 VS11 中的“无法将函数定义与现有声明匹配”。我通过将模板定义放在单独的行上来修复它:
template <typename T>
template <typename T2>
Vector<T>::Vector(const Vector<T2> &other)
{
...
}
但我仍然不知道为什么需要这样做。我知道第一个定义对于在其中使用多个模板的函数/类是有效的,但是为什么当您将模板化类与模板化成员函数混合时语法会发生变化?
我的第二个问题与模板类中的类型有关。在编写迭代器时,我有以下功能:
template <typename T>
class Vector
{
...
class iterator
{
...
iterator &operator++(void);
}
}
template <typename T>
Vector<T>::iterator &Vector<T>::iterator::operator++(void)
{
...
}
这给了我“依赖名称不是类型”,后来我发现我需要在前面添加“类型名称”:
template <typename T>
typename Vector<T>::iterator &Vector<T>::iterator::operator++(void)
{
...
}
在谷歌搜索警告号(导致错误)之后,我意识到为什么存在错误,但编译器为什么不知道这Vector<T>::iterator
是一种类型并不是很明显。我的意思是,它有类的定义,所以......
无论如何,感谢您为我澄清了这几件事!