Сравните std :: ostream, чтобы увидеть, является ли он std :: cout ("нет совпадения для 'operator =='") - PullRequest
0 голосов
/ 01 апреля 2020

Функциональность этой функции заключается в том, что она будет выводить (в терминал или файл в зависимости от типа объекта ostream & os, передаваемого в качестве параметра) данные MyString (представление C -строки в m_buffer). Я получаю сообщение об ошибке компилятора, в котором говорится, что «нет соответствия для« operator == »», особенно в части кода, в которой говорится «if (os == std :: cout)» Есть предложения? Спасибо!

//in header file
friend std::ostream & operator<<(std::ostream & os, const MyString & myStr);

//in cpp file
bool MyString::operator==(const MyString & other)const{
if(strcmp(m_buffer,other.m_buffer) == 0){
    return true;
}else if (strcmp(m_buffer,other.m_buffer) != 0){
    return false;
}
}

std::ostream& operator<<(std::ostream& os, const MyString& myStr){
  if(os == std::cout){
  os << myStr.m_buffer << std::endl;
}
}

Ответы [ 2 ]

6 голосов
/ 01 апреля 2020

Вы можете сравнить адреса:

if (&os == &std::cout) {
  os << myStr.m_buffer << std::endl;
}

будет выводиться (на терминал или файл в зависимости от типа объекта ostream и os, передаваемого в качестве параметра)

os также может быть файловым потоком, поскольку файловые потоки также получены из std::ostream / std::istream. Таким образом, запись в os запишет в терминал или файл, который представляет поток, так что действительно нет необходимости в условии.

0 голосов
/ 01 апреля 2020

Поскольку класс std::ostream aka std::basic_ostream < char > никоим образом не предоставляет операторов сравнения и, в общем, не имеет смысла сравнивать потоки.

При этом возможное решение (основанное на этот ответ ) это

if( std::addressof( os ) == std::addressof( std::cout ) )
  {
    os << myStr.m_buffer << std::endl;
  }

-

Ссылки:

https://en.cppreference.com/w/cpp/io/basic_ostream

https://en.cppreference.com/w/cpp/memory/addressof

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...