2013-07-24 15 views
5

dla kodu, dlaczego błąd, osteam_iterator jest klasą szablonów, dlaczego żaden konstruktor dopasowujący do inicjalizacji "ostream_iterator", proszę o pomoc, dziękuję. określić ostream_iterator template> klasa _LIBCPP_VISIBLE ostream_iteratorBrak zgodnego konstruktora dla "ostream_iterator <int>"

int main(int argc, const char * argv[]) 
{ 
    vector<int> sentence1; 
    sentence1.reserve(5);// 设置每次分配内存的大小 

    sentence1.push_back(1); 
    sentence1.push_back(2); 
    sentence1.push_back(3); 
    sentence1.push_back(4); 
    sentence1.push_back(5); 

    int c = 5; 

    copy(sentence1.begin(), sentence1.end(), ostream_iterator<int>(cout, 1)); 
    cout << endl; 
+0

http://en.cppreference.com/w/cpp/iterator/ostream_iterator/ostream_iterator –

+0

co to znaczy, ten link jest aktualną stroną. –

+0

Ups, naprawiłem to teraz;) –

Odpowiedz

0

Definicja klasy ostream_iterator wygląda następująco:

template< class T, 
    class CharT = char, 
    class Traits = std::char_traits<charT>> 
class ostream_iterator /*...*/ 

natomiast odpowiedni konstruktor jest zadeklarowana jako:

ostream_iterator(ostream_type& buffer, const CharT* delim) 

Ponieważ drugi szablon Argument o ostream_iterator ma obowiązek być typu znaków ty nie można po prostu zastąpić go int.

Jeśli ommit drugi parametr szablonu można podłączyć ciąg dosłownym typu char const *:

std::copy(sentence1.begin(), sentence1.end(), std::ostream_iterator<int>(cout, ",")); 

If C++ 11 jest dostępny dla Ciebie to

int c = 5; 
for (auto v : sentence1) std::cout << v << c; 

jest innym sposobem robienie tego, na co zasłużyłeś i może być odpowiednie. Zaletą jest to, że operator<< jest bardziej elastyczny niż argument typu "wskaźnik do typu znaku".

+0

Nie lubię niepotrzebnego downwotowania. – Pixelchemist

2

std::ostream_iterator pobiera ciąg jako drugi parametr do konstruktora. Jest to ciąg, który będzie wyprowadzany po każdej liczbie całkowitej w sekwencji.

5

ostream_iterator konstruktor wykonuje const CharT* delim jako drugi parametr:

ostream_iterator (ostream_type & strumień const wykres * ogranicznik) (1)

ostream_iterator (ostream_type & strumień) (2)

Aby kod działał, musisz podać ciąg znaków:

std::copy(sentence1.begin(), sentence1.end(), std::ostream_iterator<int>(cout, "1")); 
//                    ^^^^ 
+0

dziękuję, tak, zadziałało. –

Powiązane problemy