我认为这是一个非常基本的问题,但我找不到类似的东西。
以下代码无法编译(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
。相反,它似乎被删除了。
答案 0 :(得分:5)
const
不仅仅是文字替换,而且适用于整个类型T
。
如果T
为Param&
,则const T
和const Param&
不相同;前者与Param& const
相同,相当于Param&
如果你编写不太常见的“postfix-const”形式就会变得更加明显:T const
和Param 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声明的成员函数不会覆盖基类成员