Qt 类'的构造函数;QSharedPointer<;T>';声明为';显式';-如何解决此错误
尝试使用时出现以下错误:Qt 类'的构造函数;QSharedPointer<;T>';声明为';显式';-如何解决此错误,qt,qsharedpointer,Qt,Qsharedpointer,尝试使用时出现以下错误: typedef QSharedPointer<Test> CTest CTest* Module::function(params) { CTestNew* ptr = new CTestNew(params); dosomething(); return ptr; } typedef QSharedPointer CTest CTest*模块::函数(参数) { CTestNew*ptr=新CTestNew(参数); do
typedef QSharedPointer<Test> CTest
CTest* Module::function(params)
{
CTestNew* ptr = new CTestNew(params);
dosomething();
return ptr;
}
typedef QSharedPointer CTest
CTest*模块::函数(参数)
{
CTestNew*ptr=新CTestNew(参数);
dosomething();
返回ptr;
}
然后将代码中的Test*替换为CTest。
我错过了什么
error C2664: 'QSharedPointer<T>::QSharedPointer(const QSharedPointer<T> &)' : cannot convert parameter 1 from 'CTestNew*' to 'const QSharedPointer<T> &'
with
[
T=Test
]
Reason: cannot convert from 'CTestNew *' to 'const QSharedPointer<T>'
with
[
T=Test
]
Constructor for class 'QSharedPointer<T>' is declared 'explicit'
with
[
T=Test
]
错误C2664:'QSharedPointer::QSharedPointer(const QSharedPointer&'):无法将参数1从'CTestNew*'转换为'const QSharedPointer&'
具有
[
T=试验
]
原因:无法从“CTestNew*”转换为“const QSharedPointer”
具有
[
T=试验
]
类“QSharedPointer”的构造函数声明为“显式”
具有
[
T=试验
]
编译器错误指出CTestNew
与Test
CTest* Module::function(params)
{
CTestNew* ptr = new CTestNew(params);
dosomething();
return ptr;
}
编辑:回应评论说,CTestNew
是抽象Test
CTest* Module::function(params)
{
CTestNew* ptr = new CTestNew(params);
dosomething();
return ptr;
}
应该是:
CTest Module::function(params) // Don't return a pointer to a shared pointer
{
Test * ptr = new Test(params); // You're using Test not CTestNew in the CTest typedef
dosomething();
return CTest(static_cast<Test *>(ptr));
}
CTest Module::function(params)//不要返回指向共享指针的指针
{
Test*ptr=new Test(params);//您正在CTest typedef中使用Test not CTestNew
dosomething();
返回CTest(静态施法(ptr));
}
不要在需要使用Test
的地方使用CTestNew
@Ronny:他正在做ctestfoo(new-CTestNew)
或类似的事情,他应该在那里做ctestfoo(new-Test)
-至少编译器错误是这么说的。我明白了。在这种情况下,你是对的。他需要澄清这一点。@Rony/Erik:谢谢你的评论。有一个函数Test*函数(参数),其中创建了指向CTestNew的指针。CTestNew*ptr=dosomething(),此函数返回CTestNew。它在我添加typedef之前就起作用了,因为CTestNew是从Test继承的。在这种情况下我应该进行类型转换吗?CTest*Module::function(params){CTestNew*ptr=new CTestNew(params);dosomething();return ptr;}您应该为您的问题提供一个更清晰的标题以获得更好的答案;)