【问题标题】:C++ Error: 'no matching function for call to [class]::[function]'C++ 错误:'没有用于调用 [class]::[function] 的匹配函数'
【发布时间】:2014-11-29 20:26:37
【问题描述】:

我有一个带有方法的模板类template <typename T> class MyClass

void add (T& item) {
    data[indexToInsert++] = &item; // data is an array of T*
}

主要:

MyClass<int> thing;
thing.add(10);

在第二行,我得到这个错误:

no matching function for call to MyClass::add(int)

为什么会这样?

【问题讨论】:

  • T&amp; 这样的非 const 左值引用不能绑定到像 10 这样的右值。无论如何,编译器应该如何获取10 的地址?

标签: c++ class templates methods reference


【解决方案1】:

您的成员函数需要对T 的引用,即int&amp;。您传递的是一个普通的int,而不是int 类型的变量,C++ 可以对其进行引用。这是不允许的:您可以传递 int 来代替常量引用,但不能代替非常量引用。

这样做的原因是,当您传递一个值代替常量引用时,C++ 可以创建一个临时对象,将值复制到其中,并将对该临时对象的引用传递给函数。对非常量引用执行相同操作是不正确的,因为您的代码无法访问可能修改的临时对象。

您的代码说明了这不正确的原因:您将10 传递给您的函数,但该函数采用item 的地址。 10的地址是什么? C++ 不知道,因为整数文字 10 没有地址。

您可以通过提供int 类型的变量,将其设置为10,然后调用add 来修复调用:

MyClass<int> thing;
int ten = 10;
thing.add(ten);

但是,您需要确保thing 的范围不会比ten 更宽,否则您最终会在data 对象的data 数组中得到一个“悬空指针”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多