Технически, у вас есть два способа компилировать код (без изменения шаблона):
MyClass x;
int* y = new int();
Storage<int*> test1(&x, &y);
// ^ (!)
template <class T2> // T2 is int* ...
class Storage
{
Storage(MyClass* m, T2* value); // ... so you need to pass a pointer to int* (i. e. int**)
};
В этом варианте test1
будет содержать указатель на y
сам по себе & ndash; не указатель на объект y
, на который указывает. Я в значительной степени сомневаюсь, однако, это то, что вы действительно хотите ...
Второй вариант:
MyClass x;
int* y = new int();
Storage<int> test1(&x, y);
template <class T2> // T2 now is int ...
class Storage
{
Storage(MyClass* m, T2* value); // ... and you pass a pointer to int
};
Теперь значение y
копируется в параметр value
(т. Е. y
и value
- и позже m_value
- указывают на тот же объект).
Третий вариант требует изменения шаблона:
template <class T2>
class Storage
{
private:
MyClass* m;
T2 m_value; // no pointer!
public:
Storage(MyClass* m, T2 value) // no pointer!
: m_value(value) // side note: you should prefer object's initializer list
// (not to be confused with std::initializer_list!)
{ }
};
Storage<int*> test1(&x, y);
Теперь сам T2 снова является указателем, и вы фактически получаете тот же результат, что и во втором варианте (и для получения того же эффекта, что и в первом, вам нужно указать Storage<int**>
).
Прямое сравнение второго и третьего варианта:
template <class T2> template <class T2>
class Storage class Storage
{ {
T2* m_value; T2 m_value;
}; };
Storage<int> test1(&x, y); Storage<int*> test1(&x, y);
Внутри у вас есть оба раза указатель на int & ndash; разница в том, как ты туда попал ...