Оператор присваивания по умолчанию для класса шаблона с различными параметрами шаблона - PullRequest
2 голосов
/ 02 апреля 2012

При компиляции следующего:

template <class T>
class Number
{
    private:
        T num;
    public:
        Number() {}
        Number( T n ) : num(n) {}
        operator T() const { return num; }
};

int main()
{
    Number<int> n=5;
    Number<char> c=4;
    int i;

    c=int(5);
    i=n;
    c=n;

    return 0;
}

Компилятор застревает при третьем назначении, говоря, что нет совпадения для operator= в c=n.Разве n не должен быть преобразован в int, что, в свою очередь, будет присвоено c?

Ответы [ 2 ]

4 голосов
/ 02 апреля 2012

В соответствии со стандартом не более одного пользовательского преобразования (конструктор или функция преобразования) неявно применяется к одному значению. Здесь вы ожидаете, что компилятор применит конструктор для Number<char> и оператор преобразования для Number<int>. Смотри: https://stackoverflow.com/a/867804/677131.

2 голосов
/ 02 апреля 2012

Это потому, что нет оператора int, когда ваш шаблонный класс создается с шаблонным типом как char.

У вас здесь нет оператора присваивания, только конструктор и оператор типа. Это означает, что ваш компилятор, вероятно, поместил бы в него компилятор по умолчанию, вероятно, в соответствии с:

Number<T>& operator=( Number<T>& rhs );

Вы должны реализовать свой собственный оператор присваивания, это должно решить вашу проблему. Общее решение может быть следующим, но основано на действительном назначении между типами.

template <typename T, typename V>
class Number
{
    private:
        T num;
    public:
        Number() {}
        Number( T n ) : num(n) {}
        operator T() const { return num; }
        operator=( V& rhs ){ num = rhs; // etc }
};

Вам также нужно сделать конструктор вашего класса explicit, чтобы избежать неявного преобразования (если это не то, что вы хотите).

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