2011-06-13 16 views
2

编译我的代码时,我收到以下错误。如果只有一个候选人,为什么会抛出错误?为什么它不能使用它?C++编译错误只有一个候选函数

error: no matching function for call to '

TemplateParameters::reset_template_params(
    const char [8], 
    const char [11], 
    std::vector<const Channel*>, 
    bool, 
    std::map<int, String, std::less<int>, 
    std::allocator<std::pair<const int, String> > >& 
) 

'

note: candidates are:

void TemplateParameters::reset_template_params(
    String, 
    String, 
    std::vector<const Channel*>&, 
    bool, 
    std::map<int, String, std::less<int>, 
    std::allocator<std::pair<const int, String> > >& 
) 
+3

'String'参数是可疑的。 ('std :: vector &'也可能会被怀疑)。可能没有可用的转换序列将'const char [8]'或'const char [11]'转换为'String '。你可能需要在你调用'reset_template_params'的地方发布代码片段(这样我们就可以看到你实际传递的是什么),并且提到实际是什么(字符串)(它当然不是'std :: string')我可以告诉)。 – 2011-06-13 12:16:28

+2

我冒昧地设置了错误信息的格式,以便它至少具有基本的可读性。下次你可以自己做这个。 – 2011-06-13 12:17:01

+0

@In silico:为什么要在评论中发布答案? – Dani 2011-06-13 12:20:36

回答

3

通话和候选人之间有两点区别:

  • 前两个String的论点。如果不存在从C字符串文字到此类的隐式转换,则该调用是不可能的。

  • vectorvector&参数。我会肢体出去,并假设你正在临时将一个新创建的矢量传递给该函数。编译器不允许这样做,因为您无法将临时绑定到非常量引用。相反,使用const-reference可以在这里工作。但是这当然意味着该参数不能在该方法内部修改。

    既然你没有展示你如何调用代码,这当然是空闲的猜测。

+0

你的秒点解决了我现在可以编译的问题。是的,我正在临时通过,现在我接受它作为常量参考。是否有任何问题需要考虑将临时绑定到const引用。 – Poorna 2011-06-13 12:29:35

0

你的函数调用:

TemplateParameters::reset_template_params()经过5个参数和编译器不能找到具有相同参数的函数。因此错误。

编译器可以找到一个函数TemplateParameters::reset_template_params(),但传递的参数与编译器在函数TemplateParameters :: reset_template_params()中看到的函数声明不匹配。

您需要有一个重载版本的TemplateParameters::reset_template_params(),其中的参数完全相同。

+0

我通过五个参数不是六个 – Poorna 2011-06-13 12:21:14

+0

为什么downvote?我从来没有要求不要低估,但如果你做得不好,请留下原因为什么如此。 – 2011-06-13 12:21:44

+0

我不负责downvote,但可以看到,如果这不是一个模板,参数不必是*精确*匹配。可以转换为参数类型就足够了。 – 2011-06-13 12:22:42

1

您正在传递字符串文字,并且您的函数预计String s。您的String类是否有一个(非explicit)构造函数,可以用char const*来调用?如果不是,那就是你的问题。

0

清理您的参数,可以,你给的每一件事情,直接转化成参数,例如: 字符串不能同时为const char [8]或为const char [11]除非另有说明,并转换明确