给出以下代码:
class MyClass {};
template< class T > class Base {};
template< class T > class Derived : public Base< const T > {};
Base< const MyClass* >* MyFunc ()
{
return new Derived< MyClass* >();
}
clang给出:
error: cannot initialize return object of type 'Base<const MyClass *> *' with an rvalue of type 'Derived<MyClass *> *'
然而,&#34;派生MyClass *&#34;源自&#34; Base const MyClass *&#34;,所以我期望它能够工作。 我出了什么问题?
答案 0 :(得分:2)
Derived< MyClass* >
源自Base<MyClass * const>
请注意此处的内容为const
,因为T
不是MyClass
,而是MyClass*
如果要在const
是指针类型时强制将T
应用于指针对象,则需要使用辅助模板&amp;一些元编程。
答案 1 :(得分:2)
这是因为Derived<MyClass*>
来自Base<MyClass* const>
,不是 Base<const MyClass*>
。前者表示指向const
的{{1}}指针,后者表示指向MyClass
的指针。
你需要考虑你想成为什么const MyClass
:指针或指针。
如果是指针,则只需将返回类型更改为const
*。
如果它是指针对象,那么您需要在Base<MyClass* const>
的定义中对T
进行一些转换。如果您只希望Derived
成为指针,那么T
可能适合您,否则您需要进行部分专业化。
答案 2 :(得分:0)
混乱的根源:
const MyClass* ptr; // ptr is is a non-const pointer to a const object
MyClass* const ptr; // ptr is a const pointer to a non-const object.
因此,您需要使用:
Base< MyClass const* >* MyFunc ()
{
return new Derived< MyClass* >();
}