Почему неправильно выводится аргумент шаблона?
От: MaximE Великобритания  
Дата: 30.12.02 11:12
Оценка:
Long lines wrapped. -- ПК.

        TransactionData* td = new TransactionDataImpl(rq, ids[n]);
        const std::vector<long> tradeIds = td->GetTradesIds();

        // вот это работает правильно
        //std::transform(tradeIds.begin(), tradeIds.end(), 
        //    std::inserter(trades, trades.back()), 
        //    std::bind1st(std::mem_fun(&TransactionData::GetTrade), td));

        // но я хочу вот так
        typedef std::set<BasicTradeData*> SETTRADES;
        SETTRADES trades;
        std::for_each(tradeIds.begin(), tradeIds.end(), 
            std::compose1(std::bind1st(std::mem_fun_ref(SETTRADES::insert), trades),
            std::bind1st(std::mem_fun(&TransactionData::GetTrade), td)));


d:\Program Files\Microsoft Visual Studio .NET\Vc7\include\stlport\stl\_function.h(138) : 
warning C4181: qualifier applied to reference type ignored
        d:\C++\Focus_TransactionService\Sources\Focus\DataAccess\DataAccess.cpp(80) : 
see reference to class template instantiation '_STL::binder1st<_Operation>' being compiled
        with
        [
            _Operation=_STL::mem_fun1_ref_t<_STL::pair<_STL::set<BasicTradeData *,
            _STL::less<BasicTradeData *>,_STL::allocator<BasicTradeData *>>::iterator,bool>,
            _STL::set<BasicTradeData *,_STL::less<BasicTradeData *>,
            _STL::allocator<BasicTradeData *>>,BasicTradeData & >
        ]
d:\Program Files\Microsoft Visual Studio .NET\Vc7\include\stlport\stl\_function.h(138) : 
error C2529: '__x' : reference to reference is illegal


Аргумет метода set::insert выводится не как BasicTradeData*&, а как BasicTradeData&, что за ерунда?
Re: Почему неправильно выводится аргумент шаблона?
От: Павел Кузнецов  
Дата: 30.12.02 12:25
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Аргумет метода set::insert выводится не как BasicTradeData*&, а как BasicTradeData&, что за ерунда?


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

ME>
ME>d:\Program Files\Microsoft Visual Studio .NET\Vc7\include\stlport\stl\_function.h(138) : 
ME>error C2529: '__x' : reference to reference is illegal


т.к. BasicTradeData*& — тоже ссылочный тип.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Почему неправильно выводится аргумент шаблона?
От: MaximE Великобритания  
Дата: 30.12.02 13:11
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ME>>
ME>>d:\Program Files\Microsoft Visual Studio .NET\Vc7\include\stlport\stl\_function.h(138) : 
ME>>error C2529: '__x' : reference to reference is illegal


ПК>т.к. BasicTradeData*& — тоже ссылочный тип.


Я хочу вызывать trades.insert(td->GetTrade(id)) для каждого id из вектора tradeIds.
GetTrade возвращает BasicTradeData*. Аргументом insert является BasicTradeData*&. Это же работает.
Почему же тогда не компилируется эта строчка?
std::bind1st(std::mem_fun_ref(SETTRADES::insert), trades)

Как здесь появляется ссылка на ссылку?
Re[3]: Почему неправильно выводится аргумент шаблона?
От: Павел Кузнецов  
Дата: 30.12.02 13:44
Оценка: 12 (1)
Здравствуйте, MaximE, Вы писали:

ME>Почему же тогда не компилируется эта строчка?

ME>
ME>std::bind1st(std::mem_fun_ref(SETTRADES::insert), trades)

ME>Как здесь появляется ссылка на ссылку?

template <class _Operation> 
class binder1st <...>
{ <...>
  typename _Operation::result_type
  operator()(const typename _Operation::second_argument_type& __x) const // [[*]<...>
};

template <class _Operation, class _Tp>
binder1st<_Operation> bind1st(const _Operation& __fn, const _Tp& __x) <...>


Т.к. insert имеет прототип

pair <iterator, bool> insert(const value_type& _Val);


результатом std::mem_fun_ref(&SETTRADES::insert) является:

std::mem_fun1_ref_t<
  std::pair<std::set<BasicTradeData*> >::iterator, bool>,
  std::set<BasicTradeData *>,
  const std::set<BasicTradeData *>::value_type &>


т.е., внутри шаблона binder1st typename _Operation::second_argument_type = const std::set<BasicTradeData *>::value_type &. В результате добавления к этому (уже ссылочному) типу еще одной ссылки (в точке [*]) и получается ссылка на ссылку, что стандартом не допускается.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Почему неправильно выводится аргумент шаблона?
От: MaximE Великобритания  
Дата: 30.12.02 14:00
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

[]

ПК>т.е., внутри шаблона binder1st typename _Operation::second_argument_type = const std::set<BasicTradeData *>::value_type &. В результате добавления к этому (уже ссылочному) типу еще одной ссылки (в точке [*]) и получается ссылка на ссылку, что стандартом не допускается.


Теперь понял.
Жалко, что boost эту проблему обходит в "Improved Function Object Adapters", но для этого требуется частичная специализация...
Re[5]: Почему неправильно выводится аргумент шаблона?
От: Павел Кузнецов  
Дата: 30.12.02 14:04
Оценка:
Здравствуйте, MaximE, Вы писали:

ПК>>получается ссылка на ссылку, что стандартом не допускается.


ME>Жалко, что boost эту проблему обходит в "Improved Function Object Adapters", но для этого требуется частичная специализация...


Я с boost'ом давно дела не имел, но, по-моему, там было что-то называвшееся то ли ref, то ли reference, что как-то относилось к проблеме. Во всяком случае, не вижу никаких чисто технических препятствий обойти это дело (при разработке соответствующих функторов) не прибегая к частичной специализации.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Почему неправильно выводится аргумент шаблона?
От: MaximE Великобритания  
Дата: 30.12.02 14:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, MaximE, Вы писали:


ПК>>>получается ссылка на ссылку, что стандартом не допускается.


ME>>Жалко, что boost эту проблему обходит в "Improved Function Object Adapters", но для этого требуется частичная специализация...


ПК>Я с boost'ом давно дела не имел, но, по-моему, там было что-то называвшееся то ли ref, то ли reference, что как-то относилось к проблеме. Во всяком случае, не вижу никаких чисто технических препятствий обойти это дело (при разработке соответствующих функторов) не прибегая к частичной специализации.


Да, в boost'e есть ref и cref (constant).
Я тоже подумал, что это дело можно обойти, но пока у меня эта проблема встала только в одном месте и я просто написал по-другому.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.