从const派生的类的模板问题

时间:2016-07-20 14:40:32

标签: c++

给出以下代码:

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;,所以我期望它能够工作。 我出了什么问题?

3 个答案:

答案 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* >();
}