2014-01-19 2 views
1

У меня есть этот кусок кода для класса (это фрагмент):Преобразование между 2 шаблона типа

template<typename T> 
class Pos2 { 
public: 
    T x, y; 

    Pos2() : x(0), y(0) {}; 
    Pos2(T xy) : x(xy), y(xy) {}; 
    Pos2(T x, T y) : x(x), y(y) {}; 

}; 

Теперь, я также получил 2 определений типов для него:

typedef Pos2<pos_scalar> Pos; 
typedef Pos2<size_scalar> Size; 

Все работает, как ожидалось, но когда я делаю это:

Pos p(5.5, 6.5); 
Size s(3, 8); 
p = s; 

Я получаю эту ошибку:

error: conversion from ‘Size {aka Pos2<short int>}’ to non-scalar type ‘Pos’ requested 

Это имеет смысл, но я хотел бы знать, как это исправить = P

ответ

2

добавить конструктор

template <typename Type2> Pos2(const Pos2<Type2> &other) 
{ x = other.x; y = other.y; } 
+1

Что такое 'Type2'? Вы имели в виду 'typename Type2'? – 0x499602D2

1

Вам нужно определить оператор присваивания для присвоения от типа Size к типу Pos, потому что они не одного и того же типа, поэтому между ними нет оператора присваивания по умолчанию.

Я предполагаю, что вы хотите использовать шаблон здесь, поэтому любое задание Pos2 может использоваться для назначения другому экземпляру. Например, как так:

template<typename T> 
class Pos2 { 
public: 
    T x, y; 

    Pos2() : x(0), y(0) {}; 
    Pos2(T xy) : x(xy), y(xy) {}; 
    Pos2(T x, T y) : x(x), y(y) {}; 

    template<typename FromT> 
    Pos2<T>& operator=(const Pos2<FromT>& from) { 
     x = from.x; 
     y = from.y; 
     return *this; 
    } 
}; 

Вы должны сделать то же самое с помощью конструктора копирования (не показан), так как это может случиться так, что, вероятно, вы хотите скопировать построить в одной и той же схеме, в какой-то момент.

Это работает только если уступка между типом T и FromT, то есть pos_scalar и size_scalar возможно. Если не пытаться добавить правильные явные преобразования и/или специализированные шаблоны для оператора присваивания.

Также, если какой-либо из членов Pos2 является частным или защищенным, вам необходимо будет указать friend оператору присваивания или предоставить адекватные геттеры.

Смежные вопросы