c ++没有匹配函数来调用:传递迭代器?

时间:2012-10-26 14:16:44

标签: c++ templates iterator

我在C ++代码中遇到了一个奇怪的问题。 我已经定义了名为

的TemplateClass
StateTemplate<T>

此外我定义了

typedef StateTemplate<double> StateDouble.

然后我定义了一个朋友函数

template<class S>
friend S partialEntangledScalarProduct(
    const typename std::vector<StateTemplate<T> >::const_iterator s1,
    const typename std::vector<StateTemplate<T> >::const_iterator s2,
    const typename std::vector<StateTemplate<T> >::const_iterator sSub1,
    const typename std::vector<StateTemplate<T> >::const_iterator sSub2,
    vector<unsigned int> const &pos,
    vector<unsigned int> const &posNot);

如果我现在制作

std::vector<StateDouble>::const_iterator s1;
std::vector<StateDouble>::const_iterator s2;
std::vector<StateDouble>::const_iterator sSub1;
std::vector<StateDouble>::const_iterator sSub2;

vector<unsigned int> vui;

Doub test=partialEntangledScalarProduct(s1,s2,sSub1,sSub2,vui,vui);

我收到以下错误:

no matching function for call to 
    'partialEntangledScalarProduct(
         __gnu_cxx::__normal_iterator<
             const StateTemplate<double>*,
             std::vector<
                 StateTemplate<double>,
                 std::allocator<StateTemplate<double> > > >&,
         __gnu_cxx::__normal_iterator<
             const StateTemplate<double>*,
             std::vector<
                 StateTemplate<double>,
                 std::allocator<StateTemplate<double> > > >&,
         __gnu_cxx::__normal_iterator<
             const StateTemplate<double>*,
             std::vector<
                 StateTemplate<double>,
                 std::allocator<StateTemplate<double> > > >&,
         __gnu_cxx::__normal_iterator<
             const StateTemplate<double>*,
             std::vector<
                 StateTemplate<double>,
                 std::allocator<StateTemplate<double> > > >&,
         const std::vector<unsigned int, std::allocator<unsigned int> >&,
         std::vector<unsigned int, std::allocator<unsigned int> >&)'

我已经试了好几个小时才发现问题,但似乎我忽视了一些事情。 也许有人可以帮助我?

最好的问候 多米尼克

p.s。:如果您需要有关我的代码的更多信息,请告诉我。目前我只是想给你重要的部分。

这是一个具有相同错误的小例子。

#include <iostream>
#include <vector>

template<class T>
class StateTemplate{
    template<class S>
    friend S testFunction(
        const typename std::vector<StateTemplate<S> >::const_iterator s1);
public:
StateTemplate();
};

template<class T>
StateTemplate<T>::StateTemplate(){}

template<class T>
T testFunction(
        const typename std::vector<StateTemplate<T> >::const_iterator s1)
{
    return T(1);
}

int main(){
    std::vector<double>::const_iterator s1;
    double s=testFunction<double>(s1);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

如果您正确地提交了partialEntangledScalarProduct声明,则模板参数S不会在函数参数列表中的任何位置使用。因此,编译器永远不会推导出它,你必须明确地提供它。

partialEntangledScalarProduct<SomeClass>(s1,s2,sSub1,sSub2,vui,vui);

SomeClass只是一个例子,除非您提供更多详细信息,否则确切的名称不清楚。

答案 1 :(得分:1)

(我在这台机器上没有g ++,所以这是猜想。)

我认为问题在于编译器无法推断S并且您收到了无用的错误消息。将您的使用情况更改为以下内容:

double test = partialEntangledScalarProduct<double>(s1,s2,sSub1,sSub2,vui,vui);

作为旁注,请确保在发布之前为您编译示例。我假设Doub应该是double