在回答this SO question(更好地阅读this "duplicate")时,我想出了以下解决方案来解决运算符的相关名称:

[temp.dep.res]/1:


#include <iostream>
#include <utility>

// this operator should be called from inside `istream_iterator`
std::istream& operator>>(std::istream& s, std::pair<int,int>& 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 <iterator>

#include <map>
#include <fstream>

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

    std::map<int, int> pp;
    pp.insert( std::istream_iterator<std::pair<int, int>>{in},
               std::istream_iterator<std::pair<int, int>>{} );
}

但是clang++ 3.2和g++ 4.8找不到此运算符(名称解析)。

包括<iterator>是否不定义“模板的定义点” istream_iterator

编辑:正如Andy Prowl所指出的,这与标准库无关,而是与名称查找(可以通过使用多个operator>>模仿标准库来证明,在伪造的istream的命名空间中至少有一个)。

Edit2:一种解决方法,使用[basic.lookup.argdep]/2项目符号2
#include <iostream>
#include <utility>

// can include <iterator> 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 <iterator>

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<my_int,my_int>& p)
{
    s >> p.first.m >> p.second.m;
    return s;
}

#include <map>
#include <fstream>

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

    std::map<int, int> pp;
    pp.insert( std::istream_iterator<std::pair<my_int, my_int>>{in},
               std::istream_iterator<std::pair<my_int, my_int>>{} );
}

当然,您也可以使用自己的pair类型,只要解决方法在自定义operator>>的命名空间中引入了关联的类。

最佳答案

这里的问题是,您对operator >>的调用发生在std命名空间内的某处,而参数类型所在的命名空间是std

只要编译器可以在调用发生的命名空间或参数类型存在的命名空间(在这种情况下均为operator >>命名空间)中找到std,无论它是否对于重载解析都是可行的(即在名称查找后执行),就不会在父 namespace 中寻找operator >>的更多重载。

不幸的是,您的operator >>位于全局 namespace 中,因此找不到。

关于c++ - 相关名称解析和命名空间标准/标准库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16548379/

10-16 07:32