Шаблонный оператор присваивания: допустимый C ++? - PullRequest
0 голосов
/ 22 марта 2009

Просто быстрый и простой вопрос, но не нашел его ни в одной документации.

template <class T>
T* Some_Class<T>::Some_Static_Variable = NULL;

Он компилируется с g ++, но я не уверен, что это допустимое использование. Это так?

Ответы [ 2 ]

6 голосов
/ 22 марта 2009

Да, этот код правильный. См. Это руководство C ++ Templates для получения дополнительной информации

http://www.is.pku.edu.cn/~qzy/cpp/vc-stl/templates.htm#T14

1 голос
/ 22 марта 2009

Это действительно C ++, но это не имеет ничего общего с шаблонным оператором присваивания ?! Фрагмент определяет статический член SomeClass<T> и устанавливает его начальное значение на NULL. Это нормально, если вы делаете это только один раз, в противном случае вы наступаете на страшного One Definition Rule.

Оператор шаблонного присваивания выглядит примерно так:

class AClass {
public:
    template <typename T>
    AClass& operator=(T val) {
        std::ostringstream oss;
        oss << val;
        m_value = oss.str();
        return *this;
    }
    std::string const& str() const { return m_value; }
private:
    std::string m_value;
};

std::ostream& operator<<(std::ostream& os, AClass const& obj) {
    os << obj.str();
    return os;
}

int main() {
    AClass anObject;
    anObject = 42;
    std::cout << anObject << std::endl;
    anObject = "hello world";
    std::cout << anObject << std::endl;
    return 0;
}

Оператор присваивания шаблона наиболее полезен для обеспечения преобразований при реализации вариантов классов. Есть несколько предостережений, которые вы должны принять во внимание, если собираетесь использовать этих тварей. A Поиск в Google вызовет проблемные случаи.

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