类模板上的重载方法始终提供无法将函数定义与声明匹配的 我对模板有了新的了解,我尝试修改一些提供矩阵和向量操作的C++库,我有一个向量类,我想重载操作器(),因为它处理像这个向量的操作(2 .5)将返回一个向量,它有原始向量的元素2,3,4,5,我使用一个冒号类,其中冒号(2∶5)将表示(2 5)的效果,因为我发现C++没有操作符: 希望我能给你一个恰当的介绍。 有关守则如下:

类模板上的重载方法始终提供无法将函数定义与声明匹配的 我对模板有了新的了解,我尝试修改一些提供矩阵和向量操作的C++库,我有一个向量类,我想重载操作器(),因为它处理像这个向量的操作(2 .5)将返回一个向量,它有原始向量的元素2,3,4,5,我使用一个冒号类,其中冒号(2∶5)将表示(2 5)的效果,因为我发现C++没有操作符: 希望我能给你一个恰当的介绍。 有关守则如下:,c++,templates,C++,Templates,向量类 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 = 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;
.
.
}
相关的实施是

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;

 }
}
void
冒号::应用(长n、长st、长in、长en、,
朗(乐)康斯特酒店
{
开关(_标志)
{
案例“r”:
如果((_i==0)|((_e-_s)/_i<0))le=0;
其他的
{
st=_s;
in=_i;
en=_e-(_e-_s)%_i;
le=(_e-_s)/_i+1;
}
打破
案例“a”:
如果(n)
{
st=1;
in=1;
en=n;
le=n;
}
否则le=0;
打破
}
}
编译这段代码时,我总是收到错误

错误1错误C2244:'Vector::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'
错误C2244:'Vector::operator()':无法匹配函数
现有声明的定义
定义
'Vector Vector::operator()(const冒号和)const'
现有声明
'Vector Vector::operator()(const冒号和)const'

那么我做错了什么呢?

你在声明中写道:

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
类向量
{
模板
向量运算符()(常量冒号和cex)常量
在你的定义中,你写道:

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
模板
模板
矢量
Vector::operator()(const冒号和cex)const
请注意第二个模板行中的差异:

template <size_t N, typename T> 
模板
vs

模板
您缺少那里的
typename
。因此,您希望传递的不是类型,而是
T
的实例(只有当
T
是整数类型时才可能)

这表明您的声明和定义实际上是不同的,错误的来源也不同


因为第二个
T
会隐藏第一个(这是不允许的-请参阅注释),我认为您要么想重命名第二个
T
并在定义中添加
typename
,要么想将第二个
T
一起删除。

第一个问题是您编写的模板函数参数错误:
template
。它应该是
template
,否则将被视为非类型Template参数(某些特定的
T
值)

第二个问题是函数模板参数名
T
模棱两可。编译器无法从类模板参数或函数1中知道它应该使用哪个
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
{ 
}

我会选择删除第二个
T
,因为新的向量类型显然必须是相同的。而且,标准不允许您对模板参数进行阴影处理。@Xeo:可能存在这样的可能性,OP希望具有某种类型的互操作性,但他可能完全可以从函数中删除模板,但我不允许我不知道他到底想要实现什么。为了完整起见,我将在引用标准的阴影问题中列出一个。删除第二个t并不能解决问题,出现相同的错误,重命名它可以解决错误,但现在当我尝试使用它时,它看不到该函数,并给出错误
code
error 10 error C2664:“const double&Vector::operator()(size_t)const”:无法将参数1从“冒号”转换为“size_t”c:\source\maskrepair\commonmodules\mathsupport\tester\tester.cpp 67它只看到另一个重载函数在
operator()
的(声明和定义)中删除了t吗?请注意,新向量的大小(您的
N
)永远不会被推导-怎么可能?而且你永远也无法从运行时参数中获得模板参数。我认为你需要重新考虑你的设计。要进一步使用@Xeo:如果向量大小是编译时常量,那么冒号范围必须是编译时才能起作用。但是,你可以定义一个运行时大小的向量类,这将作为运行时大小的冒号操作的结果返回。一旦函数的结果取决于运行时值,就不能在编译时定义它。
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
{ 
}
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
{ 
}