Функция шаблона C ++ - Ошибка компилятора: «не может измениться с const char * на int» - PullRequest
1 голос
/ 28 ноября 2011

У меня указана шаблонная функция:

template<class T> void jsonParse(json_object* jobj, eParseWhat parseWhat, T &value) {
    ...

    if(parseWhat == PARSE_UID) {
        value = json_object_getInt(val);
    }
    if(parseWhar == PARSE_EMAIL) {
        value = json_object_getString(val);
    }
    ...
}

Теперь, когда я хочу проанализировать uid объекта json, я вызываю метод с int:

json_object* obj = ...;
int uid = 0;
jsonParse(obj,PARSE_UID,uid);

Но тогда при назначении в строке происходит ошибка компиляции:

value = json_object_getString(val);

Из-за вызова с int компилятор считает, что тип переменной value равен int иjson_object_getString(val) возвращает const char*.Поэтому компилятор говорит: can not convert from const char* to int.

Есть ли у вас какие-либо предложения по решению этой проблемы?

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

Почему вы даже используете шаблон, если собираетесь сделать оператор switch для группы операторов if для каждого типа?Ваш экземпляр шаблона никогда не скомпилируется, если вы хотите рассматривать каждый тип как несколько типов.Этот дизайн несовершенен, но если вам необходимо, вы можете использовать специализации для достижения чего-то похожего.

template<class T> void jsonParse(json_object* jobj, eParseWhat parseWhat, T &value) {
    static_assert(false); // not a handled type
}

template<> void jsonParse(json_object* jobj, eParseWhat parseWhat, int &value) {
    value = json_object_getInt(val);
}

template<> void jsonParse(json_object* jobj, eParseWhat parseWhat, std::string &value) {
    value = json_object_getString(val);
}

Как указывает GMan, обычно предпочтительнее перегружать функции, чем специализировать шаблон функции.Эквивалент с использованием перегруженной функции будет выглядеть примерно так:

void jsonParse(json_object* jobj, eParseWhat parseWhat, int &value) {
        value = json_object_getInt(val);
    }

void jsonParse(json_object* jobj, eParseWhat parseWhat, std::string &value) {
        value = json_object_getString(val);
    }
0 голосов
/ 28 ноября 2011

Ваш код никак не компилируется, потому что в этом методе значение T не может быть одновременно int и char * ...

Вы пытаетесь привести разные типы (один тип int, on это символ) к значению (которое даже не определено);)

Сначала вы должны использовать:

json_object* obj = ...;
int uid = 0;

jsonParse<int>(obj,PARSE_UID,uid); //last parameter is int

или

jsonParse<string>(obj,PARSE_UID,whatever); //last parameter is string

Но это не работает, как было сказано ранее ... вы не можете использовать тип двумя различными способами в одном шаблоне ...

Извините ...:)

0 голосов
/ 28 ноября 2011

Вы не намеревались написать:

    if(parseWhat == PARSE_UID) {
        value = json_object_getInt(val);
    }
    else if(parseWhar == PARSE_EMAIL) {
        value = json_object_getString(val);
    }

О sidenote: использование шаблона в вашем примере довольно странно и сбивает меня с толку. Я бы предпочел использовать какой-то класс Variant для этого (один пример - boost :: any , но вы можете легко реализовать свой собственный - это всего два часа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...