Моя проблема лучше всего демонстрируется следующим кодом:
#include <fstream>
#include <iterator>
class Bar
{
public: template <class Iterator> Bar(Iterator first, Iterator last) {}
};
void foo(const Bar& bar) { }
int main(int argc, char** argv)
{
std::ifstream file("file.txt");
Bar bar(std::istream_iterator<char>(file), std::istream_iterator<char>());
foo(bar); // error C2664: 'foo' : cannot convert parameter 1 from 'Bar (__cdecl *)(std::istream_iterator<_Ty>,std::istream_iterator<_Ty> (__cdecl *)(void))' to 'const Bar &'
// with
// [
// _Ty=char
// ]
// Reason: cannot convert from 'overloaded-function' to 'const Bar'
// No constructor could take the source type, or constructor overload resolution was ambiguous
return 0;
};
Вот несколько подобных примеров bar
, которые не вызывают такой же неоднозначности:
Bar bar = Bar(std::istream_iterator<char>(file), std::istream_iterator<char>());
и
std::istream_iterator<char> start(file);
std::istream_iterator<char> end;
Bar bar(start, end);
У меня вопрос , что это за первое объявление bar
, которое приводит к неправильной интерпретации?
примечание: я тестирую сVisual Studio 2010 (10.0.30319.1)