2015-03-23 2 views
1

Я пытался создать универсальный держатель класса потока, но мне кажется, что я не могу передать std::cout к нему, код:Не удается передать зЬй :: COUT в ostream & конструктор

#include <iostream> 

struct x 
{ 
    std::ostream &o; 
    x(std::ostream &o):o(o){} 
}; 

int main() 
{ 
    x(std::cout); 
    x.o<<"Hi\n"; 
    return 0; 
} 

терпит неудачу при компиляции, как:

c++ str.cc -o str -std=c++11 
str.cc: In function ‘int main()’: 
str.cc:11:14: error: invalid use of qualified-name ‘std::cout’ 
str.cc:12:4: error: expected unqualified-id before ‘.’ token 

Почему?

+4

вы имели в виду 'х SomeName (Std :: COUT); someName.o << ... '? – Angew

+2

Причина, по которой эта первая строка является ошибкой, должна быть такой же: http://stackoverflow.com/questions/24623071/is-typex-valid. Тем не менее вы не можете использовать 'x', как объект. 'x.o' не имеет смысла, так как' x' является типом. – chris

+0

Как крис указывает на ответ, объясняющий, почему он не работает, но это выглядит как опечатка, как указывает @Angew. –

ответ

6
x(std::cout); 

эквивалентно

x std::cout; 

, которая пытается объявить локальную переменную с именем std::cout. Это не разрешено.

Если вы хотите, чтобы объявить переменную типа x, передавая std::cout в конструктор, то это

x x(std::cout); 

хотя, ради вашего здравомыслия, было бы лучше, чтобы дать ему другое имя для класс (и измените следующую строку, чтобы использовать это имя).

1

Использование:

int main() 
{ 
    x object(std::cout); 
    object.o << "Hi\n"; 
    return 0; 
} 
Смежные вопросы