1

我在我的 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> >&)'

我已经尝试了几个小时来找到问题,但似乎我忽略了一些东西。也许有人可以帮助我?

最好的问候多米尼克

ps:如果您需要有关我的代码的更多信息,请告诉我。此刻我只想给你重要的部分。

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

#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;
}
4

2 回答 2

2

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

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

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

于 2012-10-26T14:42:43.583 回答
1

(I don't have g++ on this machine, so this is conjecture.)

I think the issue is that the compiler can't deduce S and you're getting an unhelpful error message. Change your usage to the following:

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

As a side note, make sure your examples compile for you before you post them. I'm assuming Doub was supposed to be double?

于 2012-10-26T14:35:07.297 回答