为什么模板参数会丢失常量?

时间:2017-02-21 13:52:45

标签: c++ templates interface

我认为这是一个非常基本的问题,但我找不到类似的东西。

以下代码无法编译(C3668)

struct Param
{
    int a;
    int b;
};

template <typename T>
struct Foo
{
    virtual void doStuff (const T) const = 0;
};

struct Bar : public Foo<Param&>
{
    void doStuff (const Param &) const override
    {
        /*...*/
    }
};

中删除const后将编译
void doStuff (const Param &)

我在这里缺少什么?我期望通过我的界面声明强制执行const Param& in Foo::doStuff。相反,它似乎被删除了。

3 个答案:

答案 0 :(得分:5)

const不仅仅是文字替换,而且适用于整个类型T

如果TParam&,则const Tconst Param&不相同;前者与Param& const相同,相当于Param& 如果你编写不太常见的“postfix-const”形式就会变得更加明显:T constParam const &无论T是什么都不等同。

因此,您的“覆盖”不会覆盖任何内容,并且您会收到编译错误。

答案 1 :(得分:1)

当你有

const Param

它与

的类型不同
struct Bar : public Foo<Param&>

第一个是常数,无论T是什么,所以在这种情况下,你有一个对T的恒定引用,这实际上没有意义,因为引用不能被反弹。在后面,它是对struct Bar : public Foo<Param> 的引用。

你能做的就是改变

virtual void doStuff (const T) const = 0;

virtual void doStuff (const T&) const = 0;

然后

$userArr = array("0"=>"Veronica", "1"=>"Alex", "2"=>"Joe", "3"=>"Alex", "4"=>"Veronica");

echo count($userArr);

答案 2 :(得分:1)

问题不在于const .Problem与覆盖有关。 使用override声明的成员函数不会覆盖基类成员