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

(私はこのマシンにg ++を持っていないので、これは推測です。)

問題は、コンパイラが推測できずS、役に立たないエラーメッセージが表示されることだと思います。使用法を次のように変更します。

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

補足として、投稿する前に、例がコンパイルされていることを確認してください。私はDoubそうなるはずだったとdouble思いますか?

于 2012-10-26T14:35:07.297 に答える