我在C ++代码中遇到了一个奇怪的问题。 我已经定义了名为
的TemplateClassStateTemplate<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;
}
答案 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
?