所以,我正在为一个作业开发一个模板化的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)
{
...
}
给了我“依赖名称不是类型”,后来我发现我需要在前面添加“typename”:
template <typename T>
typename Vector<T>::iterator &Vector<T>::iterator::operator++(void)
{
...
}
在谷歌搜索警告号码(导致错误)之后,我意识到错误存在的原因,但是为什么编译器不知道Vector<T>::iterator
是一个类型也不是很明显。我的意思是,它有类的定义,所以......
无论如何,谢谢你为我澄清这些事情!
答案 0 :(得分:1)
template <typename T>
template <typename T2>
Vector<T>::Vector(const Vector<T2> &other)
{
也可以写为
template <typename T> template <typename T2>
Vector<T>::Vector(const Vector<T2> &other)
{
你只需要(?)将它写成两组,因为它们是在所有两组参数之后 - 第一组用于类,第二组用于函数。
typename
依赖类型和相关规则(模板基类成员this
和模板成员函数{?}} {}}与名为"Two Phase Lookup"的东西有关。然而,这在MSVC ++上实现得很糟糕(因为它没有),所以它可能不会像符合实现那样抛出错误。
更多信息 - http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html http://womble.decadent.org.uk/c++/template-faq.html#disambiguation http://eli.thegreenplace.net/2012/02/06/dependent-name-lookup-for-c-templates/