2013-05-14 16 views
6

(daha iyi this "duplicate" okuyun), bir operatörün bağımlı ad çözümlemesi için aşağıdaki çözüm geldi this SO question yanıtladığı sırada:Bağımlı ad çözümlemesi ve ad std/Standart Kütüphane

[temp.dep.res]/1: bağlı adları çözülmesi için de

, aşağıdaki kaynaklardan adları olarak kabul edilir: şablon tanımı noktasında görebilir

  • bildirimleri.
  • Hem işlevlendirme bağlamından (14.6.4.1) hem de işlev bağlamından işlev argümanlarının türleriyle ilişkili ad alanlarındaki beyanlar.
#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>>{}); 
} 

Ama clang ++ 3.2 ve g ++ 4.8 Bu operatör (isim çözünürlüğü) bulmuyorum.

<iterator> dahil istream_iterator "şablonun tanımının noktası" define yok mu?

Düzenleme: Andy Prowl işaret ettiği gibi, bu Standart Kütüphanesi ile ilgisi yoktur, sadece isim arama ile (birden operator>> ile sahte istream ait ad, en az bir standart Kitaplığı taklit ederek kanıtlanabilir).


Edit2: Bir geçici çözüm, kullanan [basic.lookup.argdep]/2 mermi 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>>{}); 
} 

Tabii ki, siz de kendi pair türünü kullanabilirsiniz sürece geçici çözüm bir tanıtır olarak Özel operator>> ad alanındaki ilişkili sınıf.

cevap

3

Burada sorun, operator >> aramanızın yapıldığı noktanın, std ad alanının içinde bir yerde ve bağımsız değişkenlerin türlerinin bulunduğu ad alanının std olduğu yönündedir.

Derleyicinin, arama gerçekleştiği ad alanında veya bağımsız değişken türlerinin bulunduğu ad alanında (bu durumda std ad alanı olsun) derleyicide operator >> bulunup bulunup bulunmadığı, aşırı yük olup olmadığına bakılmaksızın sağlanır. Çözünürlük ( adında arama yapıldıktan sonra yapılır), ana ad alanlarında operator >> daha fazla aşırı yüklenme aramaktan rahatsız olmaz.

Ne yazık ki sizin bölge numarası operator >> yaşıyor ve bu nedenle, bulamamaktadır.

+0

Referans verebilir misiniz lütfen? :) Standart – dyp

+0

@DyP'ye bakmaya hevesliyim: Cevabımın düzenlemesi gerekiyor;) Üzerinde çalışacağım –

+0

Tamam Anladım :) [basic.lookup.unqual]/1; İlişkili ad alanlarındaki/argüman bağımlı aramada arama, her iki tür de 'namespace std''den olduğundan çalışmaz. – dyp