Visual Studio 15: перегрузка оператора вставки «<<» в C ++ - PullRequest
0 голосов
/ 12 мая 2018

Приведенный ниже код отлично работает с GNU GCC v7.1.1 , но выдает ОШИБКУ с VS15

#include <iostream>

class Logger {
public:
    //var should be initialized in  init loge level function
    bool debug_log_level;

    friend Logger& operator << (Logger& p, const char* str);
    Logger& logs(std::string severity, bool level = 0);
    Logger& getInstance();
};

Logger logger;
Logger& instance= logger;

Logger& Logger::getInstance() {
    static Logger theInstance;
    return theInstance;
}

Logger& Logger::logs(std::string severity, bool level)
{
    //Unused(level) as init is one time activity and will use it's own variable.
    std::cout<<severity << ": ";
    return instance;
}

//will be invoked when RHS is class reference and LHS is "str"
Logger& operator<<(Logger& p, const char* str)
{
    if(p.debug_log_level)
        std::cout << str << std::endl;
    return instance;
}

int main()
{
    logger.debug_log_level=true;
   logger.logs("Info",0)<<"Ravi..";
   return 0;
}

VS15 выдает ошибку: без оператора "<<"соответствует этим операндам </strong> в функции Logger::logs(std::string severity, bool level) в строке std::cout<<severity << ": ";.
Пожалуйста, дайте мне знать, если мне не хватает чего-то специфического для VS15.

1 Ответ

0 голосов
/ 12 мая 2018

Я не уверен, какая реализация верна в соответствии со стандартом, но в этом случае кажется, что с GCC std::ostream& operator<<(std::ostream&, const std::string&) (см. ссылка ) реализован в другом месте, чем в Visual STL Studio, и вводится при включении iostream, тогда как в Visual Studio вводится только базовая реализация std::string (реализованная в xstring).

Вы можете исправить это, добавив

#include <string>

К вашему файлу (смотрите здесь )

Я не могу найти какую-либо информацию о том, является ли правильной реализация базовой функциональности std::string в xstring (как VS) и включение в iostream, и кажется, что на самом деле std::string не должно быть видимым вообще, если вы включите только iostream (так как это, кажется, не зависит от него). В этом случае ваш код также не должен работать при использовании std::string в любом месте.

...