【问题标题】:Template problems: No matching function for call模板问题:调用没有匹配函数
【发布时间】:2011-03-03 18:36:19
【问题描述】:

我正在尝试创建一个模板类,当我定义一个非成员模板函数时,我收到“No matching function for call to 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()?

附:不要介意标记为 voodoo hackery 的位 - 这只是一个廉价的 hack,这样我就可以绕过另一个 problem I encountered

【问题讨论】:

    标签: c++ class templates function random


    【解决方案1】:

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

    randvec<some_type>()
    

    或者,在你的上下文中

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

    这实际上引发了一个问题,即为什么您决定将 randvec 定义为函数模板,而 randvec 中的任何内容实际上都取决于模板参数 T。为什么?

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

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

    泄漏由randvec分配和返回的Vector&lt;double&gt;对象。

    【讨论】:

    • @Nick Sweet:什么解决了这个问题?您是否将randvec 设为非模板?还是您在&lt;&gt; 中指定了某种类型?
    • 我在中指定了一个类型,如:vector a(randvec());是的,我意识到存在内存泄漏——我会寻找解决办法——有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2017-09-26
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多