Я озадачен, почему компилятор (g ++ ver 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
Спасибо @corykramer, он работает. Интересно, почему компилятор не может сменить 'long' на' std :: size_t' автоматически. – packetie
Он * может * изменять эти типы, но, как @Barry упоминает ниже, ни один из них не * лучше *, чем другой, поэтому функция неоднозначна. – CoryKramer