C ++中具有多参数构造函数的模板类问题

时间:2019-01-21 10:53:39

标签: c++ templates

调用模板构造函数时出现错误

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 :(得分:1)

如果要存储指向int的指针,请使用Storage<int>。效果很好:

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

    return 0; 
}

答案 1 :(得分:0)

从技术上讲,纯粹的方法有两种(无需修改模板)即可编译代码:

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本身的指针– 不是指向对象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参数中(即yvalue –之后是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的指针–不同之处在于您到达那里的方式...