Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нельзя вывести аргумент шаблона 
V
    Опции темы
cupper
Дата 19.1.2012, 23:59 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Не пойму почему в этом коде

Код

#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>

using namespace std; 

struct MyData
{
   int a;
};

bool compare(const MyData* left, const MyData* right)
{
   return left->a < right->a;
}


bool compare(shared_ptr<MyData> left, shared_ptr<MyData> right)
{
   return compare(left.get(), right.get());
}

int main()
{
   vector<const MyData* > vec;
   
   sort(vec.begin(), vec.end(), compare);
}


возникает
Код

error C2914: 'std::sort' : cannot deduce template argument as function argument is ambiguous


почему он не может вывести тип ? Ведь конструктор shared_ptr объявлен как explicit... вообще не пойму :(
PM MAIL   Вверх
Sahab
Дата 20.1.2012, 01:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



он не тип не может вывести, он не может понять какой из компараторов использовать
PM MAIL   Вверх
cupper
Дата 20.1.2012, 10:52 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



А почему не может ? потому что с типами проблема. А какая ? 
PM MAIL   Вверх
boostcoder
Дата 20.1.2012, 10:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



компилятор же ясно говорит:
Цитата

no matching function for call to 'sort(std::vector<const MyData*>::iterator, std::vector<const MyData*>::iterator, <unresolved overloaded function type>)'

что не понятно?

static_cast юзай.

Добавлено через 3 минуты и 19 секунд
Код

#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
using namespace std; 
struct MyData
{
   int a;
};
bool compare(const MyData* left, const MyData* right)
{
   return left->a < right->a;
}
bool compare(shared_ptr<MyData> left, shared_ptr<MyData> right)
{
   return compare(left.get(), right.get());
}
int main()
{
   vector<const MyData* > vec;
   
   sort(vec.begin(), vec.end(),
      static_cast<bool(*)(const MyData* left, const MyData* right)>(&compare)
   );
}



http://liveworkspace.org/code/f23e63b8dce5...97006ec3fd369fa

не?
PM WWW   Вверх
azesmcar
Дата 20.1.2012, 11:03 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



cupper

Под третий шаблонный аргумент функции sort подходят обе функции, компилятор не знает какую из них выбрать. Можешь указать тип вручную
Код

vector<const MyData*> vec;
typedef bool (*compareFn)(const MyData*, const MyData*);
sort<vector<const MyData*>::iterator, compareFn>(vec.begin(), vec.end(), compare);

или избавься от неоднозначности.
PM   Вверх
cupper
Дата 20.1.2012, 14:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата

sort(vec.begin(), vec.end(),
      static_cast<bool(*)(const MyData* left, const MyData* right)>(&compare)
   );

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

Цитата

Под третий шаблонный аргумент функции sort подходят обе функции, компилятор не знает какую из них выбрать. Можешь указать тип вручную


Да!, именно об этом я и спрашиваю. Почему шаблонизатор считает их эквивалентными ?
Мы же не можем вызвать
Код

bool compare(shared_ptr<MyData> left, shared_ptr<MyData> right)

Передав ей const Data*, ей нужен объект shared_ptr.


PS. но мы можем обе передав ей shared_ptr :( 

http://liveworkspace.org/code/5221f0636d21...57bfc649488a83c

Это сообщение отредактировал(а) cupper - 20.1.2012, 14:59
PM MAIL   Вверх
mes
Дата 20.1.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250





Цитата(cupper @  20.1.2012,  13:57 Найти цитируемый пост)
 Почему шаблонизатор считает их эквивалентными ?
Мы же не можем вызвать

на момент передачи аргументов, еще неизвестно как они будут использоваться, и более того, компилятору не известно, что нужно выбирать именно ту функцию для аргумента, которая в последствии вызовется без ошибок.. smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 20.1.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



cupper, спасибо.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.