std :: ostream & operator << (std :: ostream &, const T &) не переопределяется - PullRequest
1 голос
/ 29 июня 2011

Иногда я пишу класс (скажем, T) и пытаюсь переопределить std :: ostream & operator << (std :: ostream &, const T &), но он не работает на определенных классах. Вот пример (упрощенного) класса, где он не работал для меня. </p>

class ConfigFile {
public:
    explicit ConfigFile(const std::string& filename);
    virtual ~ConfigFile();

    bool saveToDisk() const;
    bool loadFromDisk();

    std::string getSetting(const std::string& setting, const std::string& section="Misc") const;
    void setSetting(std::string value, const std::string& name, const std::string& section ="Misc", bool updateDisk = false);

    inline const SettingSectionMap& getSettingMap() const {
         return mSettingMap;
    }

private:
    std::string         mSettingFileName;
    SettingSectionMap       mSettingMap;

#if  defined(_DEBUG) || defined(DEBUG)
public:
    friend std::ostream& operator<<(std::ostream& output, const ConfigFile& c) {
        output << “Output the settings map here”;
        return output;
    }
#endif
}

Я почти уверен, что явное ключевое слово предотвратит сценарий преобразования конструктора, но оно действует так, потому что, когда я делаю что-то вроде

std::cout << config_ << std::endl;

Это выводит что-то вроде: 0x100588140. Но затем я делаю то же самое в другом классе, как показано ниже, и все работает отлично.

class Stats {
    Stats() {};

#if  defined(_DEBUG) || defined(DEBUG)
    friend std::ostream& operator<<(std::ostream& output, const Stats& p) {
        output << "FPS Stats: " << p.lastFPS_ << ", " << p.avgFPS_ << ", " << p.bestFPS_ << ", " << p.worstFPS_ << " (Last/Average/Best/Worst)";
        return output;
    };
#endif
}; 

Спасибо за любую помощь.

EDIT: Чтобы исправить это, я теперь добавляю следующее для всех моих классов:

#if  defined(_DEBUG) || defined(DEBUG)
public:
    friend std::ostream& operator<<(std::ostream& output, const ConfigFile& c);
    friend std::ostream& operator<<(std::ostream& output, ConfigFile* c) {
        output << *c;
        return output;
}
#endif

1 Ответ

0 голосов
/ 02 июля 2011

Попробуйте изменить подпись на указатель const:

std::ostream& operator<<(std::ostream& output, const ConfigFile* c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...