Зависимое разрешение имен и пространство имен std / Стандартная библиотека

Отвечаяэтот ТАК вопрос (лучше прочитатьэтот "дублировать»), Я придумал следующее решение для зависимого разрешения имен оператора:

[Temp.dep.res] / 1:

При разрешении зависимых имен учитываются имена из следующих источников:

Объявления, которые видны в точке определения шаблона.Объявления из пространств имен, связанные с типами аргументов функции, как из контекста экземпляра (14.6.4.1), так и из контекста определения.
#include 
#include 

// this operator should be called from inside `istream_iterator`
std::istream& operator>>(std::istream& s, std::pair& p)
{
    s >> p.first >> p.second;
    return s;
}

// include definition of `istream_iterator` only after declaring the operator
// -> temp.dep.res/1 bullet 1 applies??
#include 

#include 
#include 

int main()
{
    std::ifstream in("file.in");

    std::map pp; 
    pp.insert( std::istream_iterator{in},
               std::istream_iterator{} );
}

Но clang ++ 3.2 и g ++ 4.8 не делаютнайти этот оператор (разрешение имени).

Безразлично»т включение определить "точка определения шаблона " ?istream_iterator

Изменить: какЭнди Проул указывает, что это не имеет ничего общего со стандартной библиотекой, а скорее с поиском имени (можно доказать, подражая стандартной библиотеке с несколькимиoperator>>хотя бы один в пространстве имён фейкаistream).

Edit2: обходной путь, используя [basic.lookup.argdep] / 2 bullet 2

#include 
#include 

// can include  already here,
// as the definition of a class template member function
// is only instantiated when the function is called (or explicit instantiation)
// (make sure there are no relevant instantiations before the definition
//  of the operator>> below)
#include 

struct my_int
{
    int m;
    my_int() : m() {}
    my_int(int p) : m(p) {}
    operator int() const { return m; }
};

// this operator should be called from inside `istream_iterator`
std::istream& operator>>(std::istream& s, std::pair& p)
{
    s >> p.first.m >> p.second.m;
    return s;
}

#include 
#include 

int main()
{
    std::ifstream in("file.in");

    std::map pp; 
    pp.insert( std::istream_iterator{in},
               std::istream_iterator{} );
}

Конечно, вы также можете использовать свой собственныйpair тип, пока обходной путь вводит связанный класс в пространстве имен обычая.operator>>

Ответы на вопрос(1)

Ваш ответ на вопрос