Шаблон << и >> операторы специализация - PullRequest
1 голос
/ 24 февраля 2011

Я хочу шаблонировать операторы >> и << в классе, но я бы также хотел специализировать их для строк, поэтому я сделал это;

    class sql_command
{
public:
    sql_command() { }

    explicit sql_command(std::string& cmd)
        : m_raw(cmd) {
    }

    inline sql_command& operator<<(const char * arg)
    {
        m_raw += arg;
        return *this;
    }

    inline sql_command& operator<<(const std::string& arg)
    {
        m_raw += arg;
        return *this;
    }

    template<typename T>
    inline sql_command& operator>>(const T arg)
    {
        m_raw += boost::lexical_cast<std::string>(arg);
        return *this;
    }

    inline std::string const& command() const {
        return m_raw;
    }

private:
    std::string m_raw;
};

template<>
inline sql_command& operator>> <std::string> (const std::string& arg) {
    m_raw += "'";
    m_raw += arg;
    m_raw += "'";
    return *this;
}

template<>
inline sql_command& operator>> <char*>(const char * arg) {
    m_raw += "'";
    m_raw += arg;
    m_raw += "'";
    return *this;
}

Но я получил некоторые ошибки компилятора:

1>.\main.cpp(83) : error C2912: explicit specialization; 'sql_command &operator >><std::string>(const std::string &)' is not a specialization of a function template
1>.\main.cpp(83) : error C2805: binary 'operator >>' has too few parameters

Как бы я исправить эти ошибки?

Ответы [ 2 ]

11 голосов
/ 24 февраля 2011

Вам не нужно специализировать шаблон оператора: просто напишите перегрузку, взяв std::string:

class sql_command {
    /* ... */

    template<typename T>
    sql_command& operator>>(const T& arg) { 
        /* general purpose implementation */ 
    }

    sql_command& operator>>(const std::string& arg) { 
        /* special std::string implementation */ 
    }
};

Специализация шаблона функции противная, и ее следует избегать везде, где это возможно. Для получения дополнительной информации, обратитесь к Herb Sutter Почему бы не специализировать шаблоны функций?

2 голосов
/ 24 февраля 2011

Вы забыли использовать оператор разрешения классов ::

template<>
inline sql_command& sql_command::operator>> <std::string> (const std::string& arg)
                      see this ^^ 

Сделайте это и для другой специализации!

Или лучше следуйте Джеймсу советам!

...