我是模板新手,我正在尝试修改一些向c++提供矩阵和向量操作的库,我有一个向量类,我试图重载operator()来处理像这样的操作,例如这个向量(2:5)将返回一个具有原始向量元素2,3,4,5的向量,我使用一个名为冒号(2:5)的类,其中冒号(2:5)将表示(2:5)效果,因为我发现c++没有操作符:。希望我做了一个适当的介绍。相关代码如下
向量类
template< size_t M, typename T = float >
class Vector
{
public:
typedef T value_type;
Vector operator-( const Vector& other ) const;
template <size_t N, typename T> Vector<N,T> operator()(const colon &cex) const;
.
.
}以及相应的实现
template< size_t M, typename T >
template< size_t N,T>
Vector<N,T>
Vector<M,T>::operator()( const colon &cex ) const
{
long i, ii, st = 0, in = 0, en = 0, s;
cex.apply(M, st, in, en, s);
if (s && (st>0) && (st>M))
{
Vector<N,T> result;
for (i=st,ii=0;i+=in,ii++;i<=en,ii<N)
{
result(ii)=array(i);
return result;
}
}
return 0;
}这里的返回值0只是一个占位符,它应该返回一个空向量。冒号类(取自另一个库,由我修改)。
class colon
{
public:
/// Colon expression '(:)'
colon() { _flag = 'a'; }
/// Colon expression of type '(2:5)'
colon(long s, long e) { _s = s; _i = 1; _e = e; _flag = 'r'; }
void apply(long s, long &f, long &i, long &l, long &n) const;
private:
/// Type of colon expression.
char _flag;
/// First index.
long _s;
/// Increment.
long _i;
/// Last index.
long _e;
}; /* class colon */并且相关的实现是
void
colon::apply(long n, long &st, long &in, long &en,
long &le) const
{
switch (_flag)
{
case 'r':
if ((_i == 0 ) || ((_e - _s) / _i < 0 )) le = 0;
else
{
st = _s;
in = _i;
en = _e - (_e - _s) % _i;
le = (_e - _s) / _i + 1;
}
break;
case 'a':
if (n)
{
st = 1;
in = 1;
en = n;
le = n;
}
else le = 0;
break;
}
}在编译这段代码时,我总是收到错误
错误1向量:‘C2244::operator ()’:无法将函数定义与现有声明匹配
编译器的输出是
error C2244: 'Vector<M,T>::operator ()' : unable to match function
definition to an existing declaration
definition
'Vector<N,T> Vector<M,T>::operator ()(const colon &) const'
existing declarations
'Vector<N,T> Vector<M,T>::operator ()(const colon &) const'那么我到底做错了什么呢?
发布于 2012-09-25 18:14:35
在你的声明中,你写道:
template< size_t M, typename T = float >
class Vector
{
template <size_t N, typename T>
Vector<N,T> operator()(const colon &cex) const在你的定义中,你写道:
template< size_t M, typename T >
template< size_t N,T>
Vector<N,T>
Vector<M,T>::operator()( const colon &cex ) const注意第二个模板行的不同之处:
template <size_t N, typename T> 与
template< size_t N,T>你错过了那里的typename。因此,不是将类型传递给T,而是希望传递T的实例(只有当T是整型类型时才有可能)。
这表明你的声明和定义实际上是不同的,错误是从哪里产生的。
由于您的第二个T会隐藏第一个T(这是不允许的-请参阅注释),我认为您要么希望重命名第二个T并在定义中添加typename,要么希望完全删除第二个T。
发布于 2012-09-25 18:35:05
第一个问题是你写错了模板函数参数:template<size_t N,T>。必须为template<size_t N, typename T>,否则视为非类型模板参数(T的某个特定值)。
第二个问题是函数模板参数名T不明确。编译器不知道它应该使用哪个T,是从类模板参数还是从函数?记住,函数和类模板参数是不相关的。因此您需要将其重命名:
template<size_t M, typename T> class Vector
{
public:
template <size_t N, typename X> Vector<N,X> operator()() const;
};
template<size_t M, typename T>
template<size_t N, typename X> Vector<N,X> Vector<M,T>::operator()() const
{
}但实际上,如果你不需要跨类型操作,并且X总是与T相同的类型,你可以在函数中跳过它,只根据大小对它进行参数化:
template<size_t M, typename T> class Vector
{
public:
template <size_t N> Vector<N,T> operator()() const;
};
template<size_t M, typename T>
template<size_t N> Vector<N,T> Vector<M,T>::operator()() const
{
}https://stackoverflow.com/questions/12580736
复制相似问题