我很困惑爲什麼編譯器(g ++版本4.8.4)無法編譯下面的代碼片段。在電話x.addField("hi", s.size());
中,我認爲編譯器可以簡單地使用方法void addField(const char *fieldName, long value)
,因爲它顯然是最好的匹配。g ++有麻煩選擇正確的方法
#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
class strDum {
public:
void addField(const char *fieldName, const char *fmt, ...);
void addField(const char *fieldName, bool value);
void addField(const char *fieldName, long value);
void addField(const char *fieldName, double value);
};
void strDum::addField(const char *fieldName, const char *fmt, ...) {
}
void strDum::addField(const char *fieldName, bool value) {
}
void strDum::addField(const char *fieldName, long value) {
}
void strDum::addField(const char *fieldName, double value) {
}
int main(int argc, char *argv[])
{
string s = "hello";
strDum x;
x.addField("hi", s.size());
return 0;
}
以下是編譯器錯誤消息
$ g++ -std=c++11 te4.cc
te4.cc: In function ‘int main(int, char**)’:
te4.cc:29:27: error: call of overloaded ‘addField(const char [3], std::basic_string<char>::size_type)’ is ambiguous
x.addField("hi", s.size());
^
te4.cc:29:27: note: candidates are:
te4.cc:16:6: note: void strDum::addField(const char*, const char*, ...) <near match>
void strDum::addField(const char *fieldName, const char *fmt, ...) {
^
te4.cc:16:6: note: no known conversion for argument 2 from ‘std::basic_string<char>::size_type {aka long unsigned int}’ to ‘const char*’
te4.cc:18:6: note: void strDum::addField(const char*, bool)
void strDum::addField(const char *fieldName, bool value) {
^
te4.cc:20:6: note: void strDum::addField(const char*, long int)
void strDum::addField(const char *fieldName, long value) {
^
te4.cc:22:6: note: void strDum::addField(const char*, double)
void strDum::addField(const char *fieldName, double value) {
^
任何想法?
實際上,這將簽名'(const char *,std :: size_t)' – CoryKramer
Thanks @corykramer,它的工作原理。我想知道爲什麼編譯器不能自動將'long'更改爲'std :: size_t'。 – packetie
它*可以*更改爲這些類型,但是@Barry在下面提到,它們都不比其他類型更好*,因此該函數不明確。 – CoryKramer