“没有用于调用”模板C ++的匹配函数

时间:2013-02-09 23:27:01

标签: c++ templates

帮助我不明白为什么我不能运行这段代码作为家庭作业,xCode似乎不同意我说它我没有定义功能。请参阅主要的错误

template <class Comparable>
Comparable maxSubsequenceSum1( const vector<Comparable> & a, int & seqStart, int & seqEnd){
        int n = a.size( );
        Comparable maxSum = 0;

        for( int i = 0; i < n; i++ )
            for( int j = i; j < n; j++ )
            {
                Comparable thisSum = 0;
                for( int k = i; k <= j; k++ )
                    thisSum += a[ k ];

                if( thisSum > maxSum )
                {
                    maxSum = thisSum;
                    seqStart = i;
                    seqEnd = j;
                }
            }

        return maxSum;

}



int main(){


        vector<int> vectorofints;
        vectorofints.resize(128);
        for (int i=0; i<vectorofints.size(); i++){
            vectorofints[i] = (rand() % 2001) - 1000;
        }
        maxSubsequenceSum1(vectorofints, 0, 127) //**---->the error i get in xcode is "No matching function for call to maxSubsequenceSum1"

        return 0;
}

3 个答案:

答案 0 :(得分:2)

更改签名
Comparable maxSubsequenceSum1( const vector<Comparable> & a,
                               int & seqStart, int & seqEnd)

Comparable maxSubsequenceSum1( const vector<Comparable> & a, 
                                 int seqStart, int seqEnd)

如果您执行int & i = 0;,则会出现同样的问题。您无法从右值初始化非const引用。 0127是在表达式结尾处到期的临时对象,临时对象不能绑定到非const引用。

答案 1 :(得分:0)

编译器是正确的。您正在调用maxSubsequenceSum1(std::vector<int>&, int, int),您定义了maxSubsequenceSum1(std::vector<int>&, int &, int &)

有两种快速解决方案:

1)重新定义您的功能,不参考 2)将常量移动到变量并沿此传递它们。

注意:您的代码还有另一个问题。您调用函数maxSubsequenceSum1,但您没有告诉它使用什么模板参数。

我已经纠正,纠正是正确的。该说明无效。

答案 2 :(得分:0)

您已经声明了一个需要两个整数引用的函数,但是您调用的函数按值获取两个整数。 它应该是这样的

vector<int> vectorofints;
        vectorofints.resize(128);
        for (int i=0; i<vectorofints.size(); i++){
            vectorofints[i] = (rand() % 2001) - 1000;
        }
        int k = 0;
        int j = 127;
        maxSubsequenceSum1(vectorofints, k, j) 

        return 0;