2011-06-13 17 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]除非另有說明,並轉換明確