2010-06-15 132 views
1

我想创建一个模板类,并且当我定义一个非成员模板函数时,我得到“没有匹配函数调用randvec()”的错误。模板问题:没有匹配函数调用

我有一个模板类定义为:

template <class T> 
class Vector { 
T x, y, z; 

public: 
//constructors 
Vector(); 
Vector(const T& x, const T& y, const T& z); 
Vector(const Vector& u); 

//accessors 
T getx() const; 
T gety() const; 
T getz() const; 

//mutators 
void setx(const T& x); 
void sety(const T& y); 
void setz(const T& z); 

//operations 
void operator-(); 
Vector plus(const Vector& v); 
Vector minus(const Vector& v); 
Vector cross(const Vector& v); 
T dot(const Vector& v); 
void times(const T& s); 
T length() const; 
//Vector<T>& randvec(); 

//operators 
Vector& operator=(const Vector& rhs); 
friend std::ostream& operator<< <T>(std::ostream&, const Vector<T>&); 
}; 

,问题中的函数,我上面所有这些功能后定义是:

//random Vector 
template <class T> 
Vector<double>& randvec() 
{ 
const int min=-10, max=10; 
Vector<double>* r = new Vector<double>; 
int randx, randy, randz, temp; 

const int bucket_size = RAND_MAX/(max-min +1); 

temp = rand(); //voodoo hackery 

do randx = (rand()/bucket_size)+min; 
while (randx < min || randx > max); 
r->setx(randx); 

do randy = (rand()/bucket_size)+min; 
while (randy < min || randy > max); 
r->sety(randy); 

do randz = (rand()/bucket_size)+min; 
while (randz < min || randz > max); 
r->setz(randz); 

return *r; 
} 

然而,每次我在我的主要功能使用如下行:

Vector<double> a(randvec()); 

我得到该错误。但是,如果我删除模板并使用'double'而不是'T'来定义它,那么对randvec()的调用完全可以工作。为什么它不识别randvec()?

P.S.不要介意标签为巫毒hackery的位 - 这只是一个便宜的黑客,所以我可以绕过另一个problem I encountered

回答

9

您将randvec定义为函数模板,但没有函数参数取决于模板参数T(实际上randvec根本没有函数参数)。这立即意味着编译器不可能推断从调用randvec()的模板参数T。你必须指定每个呼叫randvec明确的模板参数T,如

randvec<some_type>() 

,或者在您的上下文

Vector<double> a(randvec<some_type>()); 

这实际上是上升的,为什么你决定定义randvec作为问题一个函数模板,randvec中没有任何内容实际上取决于模板参数T。为什么?

P.S.通过引用返回动态分配的对象...可以使其正确工作,但这仍然是一个非常有问题的做法。我没有看到你的整个代码,但我猜你

Vector<double> a(randvec<some_type>()); 

泄漏Vector<double>对象分配和randvec返回。

+1

太棒了。这解决了它! – 2010-06-15 00:12:47

+0

@尼克甜心:*什么*完全解决它?你是否让你的'randvec'非模板?还是你在'<>'中指定了某种类型? – AnT 2010-06-15 00:14:36

+0

我在<>中指定了一个类型,如: vector a(randvec ()); 是的,我意识到有一个内存泄漏 - 我会考虑找到一个修复 - 任何建议? – 2010-06-15 01:37:46