几个模板问题(已经解决了…只是想知道为什么)

A Few Template Questions (already solved... just want to know why)

本文关键字:为什么 想知道 解决 几个 问题      更新时间:2023-10-16

因此,我正在为一项作业开发一个模板化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是一个类型的原因并不太明显。我的意思是,它有类的定义,所以…

不管怎样,谢谢你为我澄清了这几件事!

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和模板成员函数(?(的template(与"两阶段查找">有关。然而,这在MSVC++上实现得很糟糕(就像在not中一样(,因此它可能不会像符合要求的实现那样抛出那么多错误。

更多信息-http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.htmlhttp://womble.decadent.org.uk/c++/template faq.html#消除歧义http://eli.thegreenplace.net/2012/02/06/dependent-name-lookup-for-c-templates/

相关文章: