Проблема с шаблоном класса с конструктором нескольких параметров в C ++ - PullRequest
0 голосов
/ 21 января 2019

Я получаю сообщение об ошибке при вызове конструктора шаблона

error C2664: 'Storage<T2>::Storage(MyClass *,T2 *)' : cannot convert parameter 2 from 'int *' to 'int **'
1>        with
1>        [
1>            T2=int *
1>        ]
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Ниже приведен мой код

#include<iostream> 
using namespace std; 

class MyClass
{
private:
    int a1;
    int b;
public:
    MyClass(){}
};

template <class T2>
class Storage
{
private:
    MyClass* m;
    T2* m_value;
public:
    Storage(MyClass* m,T2* value)
    {
        m_value =value;
    }

    ~Storage()
    {
    }
};

// Main Function 
int main() 
{ 
    MyClass x;
    int *y = new int();
    Storage <int*> test1 (&x, y); 

    return 0; 
} 

Пожалуйста, помогите мне решить мою проблему.Как правильно установить класс шаблона для моего требования.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Технически, у вас есть два способа компилировать код (без изменения шаблона):

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; разница в том, как ты туда попал ...

0 голосов
/ 21 января 2019

Если вы хотите сохранить указатель на int, используйте Storage<int>. Прекрасно работает:

int main() 
{ 
    MyClass x;
    int *y = new int();
    Storage <int> test1 (&x, y); 

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