т.е., внутри шаблона binder1st typename _Operation::second_argument_type = const std::set<BasicTradeData *>::value_type &. В результате добавления к этому (уже ссылочному) типу еще одной ссылки (в точке [*]) и получается ссылка на ссылку, что стандартом не допускается.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
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: Почему неправильно выводится аргумент шаблона?
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*&. Это же работает.
Почему же тогда не компилируется эта строчка?
[]
ПК>т.е., внутри шаблона binder1st typename _Operation::second_argument_type = const std::set<BasicTradeData *>::value_type &. В результате добавления к этому (уже ссылочному) типу еще одной ссылки (в точке [*]) и получается ссылка на ссылку, что стандартом не допускается.
Теперь понял.
Жалко, что boost эту проблему обходит в "Improved Function Object Adapters", но для этого требуется частичная специализация...
Re[5]: Почему неправильно выводится аргумент шаблона?
Здравствуйте, MaximE, Вы писали:
ПК>>получается ссылка на ссылку, что стандартом не допускается.
ME>Жалко, что boost эту проблему обходит в "Improved Function Object Adapters", но для этого требуется частичная специализация...
Я с boost'ом давно дела не имел, но, по-моему, там было что-то называвшееся то ли ref, то ли reference, что как-то относилось к проблеме. Во всяком случае, не вижу никаких чисто технических препятствий обойти это дело (при разработке соответствующих функторов) не прибегая к частичной специализации.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Почему неправильно выводится аргумент шаблона?
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, MaximE, Вы писали:
ПК>>>получается ссылка на ссылку, что стандартом не допускается.
ME>>Жалко, что boost эту проблему обходит в "Improved Function Object Adapters", но для этого требуется частичная специализация...
ПК>Я с boost'ом давно дела не имел, но, по-моему, там было что-то называвшееся то ли ref, то ли reference, что как-то относилось к проблеме. Во всяком случае, не вижу никаких чисто технических препятствий обойти это дело (при разработке соответствующих функторов) не прибегая к частичной специализации.
Да, в boost'e есть ref и cref (constant).
Я тоже подумал, что это дело можно обойти, но пока у меня эта проблема встала только в одном месте и я просто написал по-другому.