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有一个关于模板语法的合法问题。