Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一些模板问题(已经解决…只是想知道为什么)_C++_Templates_Stl - Fatal编程技术网

C++ 一些模板问题(已经解决…只是想知道为什么)

C++ 一些模板问题(已经解决…只是想知道为什么),c++,templates,stl,C++,Templates,Stl,所以,我正在为一个作业开发一个模板向量类,我遇到了一些问题,我通过谷歌搜索解决了这些问题,但我仍然想知道为什么我所做的是错误的。第一个问题是我有: template <typename T> class Vector { ... template <typename T2> Vector(const Vector<T2> &other); } template <typename T, T2> 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)
{
    ...
}
模板
类向量
{
...
类迭代器
{
...
迭代器和运算符++(void);
}
}
模板
Vector::iterator&Vector::iterator::operator++(void)
{
...
}
这给了我“依赖名称不是类型”,我后来发现我需要在前面添加“类型名称”:

template <typename T>
typename Vector<T>::iterator &Vector<T>::iterator::operator++(void)
{
    ...
}
模板
typename向量::迭代器&向量::迭代器::运算符++(void)
{
...
}
在谷歌搜索了警告号(这导致了一个错误)之后,我意识到了错误存在的原因,但编译器不知道
Vector::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),因此它可能不会像一致性实现那样引发很多错误

更多信息-

要清楚(如果不是),因为OP定义模板的模板成员:模板引用类和模板,引用类的成员。(我很肯定OP知道C++中的额外空白不重要)@斯蒂芬林,我提到的不是吗?OP特别提到“分离线”。,这就是我想要更正的示例:如果Vector是一个模板,它使用两个模板参数和一个非模板构造函数,那么
TemplateVector::Vector(…)
是正确的:大多数情况下,您都是在类定义中定义模板成员函数,因此您永远不会遇到这种情况。是的,但主要问题是为什么它是两个单独的模板,而不是据我所知,它位于两条不同的行上。只是想让它更清楚。哦,快照,我输入了一个错误。我最初的实现n是使用
模板的
我可以建议你放弃问题的第二部分并作为答案吗?(第一部分当然可以保留,每个帖子只有一个问题要好得多。)谁否决了这个问题?OP有一个关于模板语法的合法问题。