[英]compile error with char * as template parameter
有人能告诉我这段代码有什么问题吗?
template <typename T>
class Base
{
public:
virtual void foo(const T & t) = 0;
virtual ~Base() {}
};
struct Derived : Base<char *> {
void foo(const char * & t) override {};
};
我得到编译错误
void Derived::foo(const char*&)' 标记为“覆盖”,但不覆盖。
为什么char *
不是一个有效的模板参数?
当你有
virtual void foo(const T & t) = 0;
而T
是char *
,则 function 类型不是const char *
。 const
适用于T
,所以你真正拥有的是char * const
。 这意味着您需要覆盖的 function
void foo(char* const& t) override {};
const 适用于其左侧的类型部分。 当且仅当其左侧没有任何东西(或支架或其他 scope 限制器)时,它才适用于其右侧的东西。
East const 是指习惯性地将 const 放在您想要 const 的东西的右侧(东)。
West const 是把 const 放在左边的习惯。
west const 的问题在于
const char*
实际上是
char const*
不是
char* const
这是你的错误的来源。
在 west const 样式中,当T
为char*
时, const T
为char*const
。 奇怪。
在东部 const 样式中, T
为char*
时的 T T const
为char*const
。 一点也不奇怪。
所以当T
是char*
时 T T const&
是char*const&
,而不是你写的const char*&
(又名char const*&
)。
立即解决编译错误:
struct Derived : Base<char *> {
void foo(char* const& t) override {};
};
const char*
表示指向常量字符的指针,但您需要引用常量字符指针。 这与前者不同,并且需要const
-qualifier 的不同位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.