Вопрос по c++, c++11 – Обернуть перегруженную функцию через std :: function

8

У меня есть перегруженная функция, которую я хочу передать, завернутый в std :: function. GCC4.6 не находит «совпадающую функцию». Хотя я нашел здесь несколько вопросов, ответы не так ясны, как хотелось бы. Может кто-нибудь сказать мне, почему следующий код не может вывести правильную перегрузку и как (элегантно) обойти это?

int test(const std::string&) {
    return 0;
}

int test(const std::string*) {
    return 0;
}

int main() {
    std::function<int(const std::string&)> func = test;
    return func();
}

Ваш Ответ

1   ответ
18

Чтобы устранить неоднозначность, используйте явное приведение как:

typedef int (*funtype)(const std::string&);

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast!

Теперь компилятор сможет устранить неоднозначность ситуации, основываясь на типе в приведении.

Или вы можете сделать это:

typedef int (*funtype)(const std::string&);

funtype fun = test; //no cast required now!
std::function<int(const std::string&)> func = fun; //no cast!

Так почемуstd::function<int(const std::string&)> не работает такfuntype fun = test работает выше?

Ну, ответ, потому чтоstd::function может быть инициализирован любым объектом, так как его конструктор является шаблоном, который не зависит от аргумента шаблона, который вы передалиstd::function.

Error: User Rate Limit Exceeded abergmeier
Error: User Rate Limit Exceededstd::functionError: User Rate Limit Exceededstd::functionError: User Rate Limit Exceeded
Error: User Rate Limit Exceededstatic_castError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы