调用模板构造函数时出现错误
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;
}
请帮助我解决问题。 如何根据我的要求正确设置模板类。
答案 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
参数中(即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的指针–不同之处在于您到达那里的方式...