Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нельзя вывести аргумент шаблона


Автор: cupper 19.1.2012, 23:59
Не пойму почему в этом коде

Код

#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... вообще не пойму :(

Автор: Sahab 20.1.2012, 01:28
он не тип не может вывести, он не может понять какой из компараторов использовать

Автор: cupper 20.1.2012, 10:52
А почему не может ? потому что с типами проблема. А какая ? 

Автор: boostcoder 20.1.2012, 10:55
компилятор же ясно говорит:
Цитата

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/f23e63b8dce56b51a97006ec3fd369fa

не?

Автор: azesmcar 20.1.2012, 11:03
cupper

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

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

или избавься от неоднозначности.

Автор: cupper 20.1.2012, 14:57
Цитата

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/5221f0636d21b0da657bfc649488a83c

Автор: mes 20.1.2012, 17:34


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

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

Автор: boostcoder 20.1.2012, 21:37
cupper, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)