模板问题:没有匹配的呼叫功能

Nic*_*eet 1 c++ random templates class function

我正在尝试创建一个模板类,当我定义一个非成员模板函数时,我得到"没有匹配函数来调用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>&);
};
Run Code Online (Sandbox Code Playgroud)

我在上述所有函数之后定义的函数是:

//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;
 }
Run Code Online (Sandbox Code Playgroud)

然而,每当我在主函数中使用如下行来调用它时:

    Vector<double> a(randvec());
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误.但是,如果我删除模板并使用'double'而不是'T'来定义它,则对randvec()的调用可以完美地工作.为什么不识别randvec()?

PS不要介意标记伏都教hackery - 这只是一个廉价的黑客,所以我可以解决我遇到的另一个问题.

AnT*_*AnT 9

您将自己定义randvec为函数模板,但没有函数参数依赖于模板参数T(事实上randvec根本没有函数参数).这立即意味着编译器不可能T从调用中推导出模板参数randvec().您必须T为每个randvec明确的调用指定模板参数,如

randvec<some_type>()
Run Code Online (Sandbox Code Playgroud)

或者,在您的背景下

Vector<double> a( randvec<some_type>() );
Run Code Online (Sandbox Code Playgroud)

这实际上提出了为什么你决定将你randvec的函数模板定义为什么,而randvec实际上什么都不依赖于模板参数的问题T.为什么?

PS通过引用返回动态分配的对象...可以使其正常工作,但它仍然是一个非常值得怀疑的做法.我没有看到你的整个代码,但我猜你的

Vector<double> a( randvec<some_type>() );
Run Code Online (Sandbox Code Playgroud)

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