使用 char * 作为模板参数编译错误
Posted
技术标签:
【中文标题】使用 char * 作为模板参数编译错误【英文标题】:compile error with char * as template parameter 【发布时间】:2021-01-20 21:39:00 【问题描述】:谁能告诉我这段代码有什么问题?
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 *
不是一个有效的模板参数?
【问题讨论】:
错字:你需要写char * const& t
。 const (char*)
是 char *const
,而不是 const char*
const char*
= char const*
你想要char* const
。编辑我打字太慢了...
@Justin 不,我不认为混淆east-const 和west-const 样式,以及由此产生的错误,算作错字。
@cigien 够公平
East const,west const,我们是如何设法逃脱诸如“当你有
virtual void foo(const T & t) = 0;
而T
是char *
,则函数类型不是const char *
。 const
适用于T
,所以你真正拥有的是char * const
。这意味着您的覆盖函数需要是
void foo(char* const& t) override ;
【讨论】:
似乎是插入East-const风格的理想场所:) @cigien 对不起,我住在中西部 ;)【参考方案2】:West const 最差 const 东 const 最佳 const
Const 适用于其左侧的类型部分。当且仅当其左侧没有任何内容(或括号或其他范围限制器)时,它才适用于其右侧的内容。
East const 是指按习惯将 const 放在你想要 const 的东西的右侧(东)。
West const 是习惯把 const 放在左边。
west const 的问题在于
const char*
其实是
char const*
不是
char* const
这是你的错误的来源。
在西 const 样式中,const T
当T
为char*
时为char*const
。令人惊讶。
在东部 const 样式中,T const
当T
为char*
时为char*const
。一点也不奇怪。
所以T const&
当T
是char*
是char*const&
,而不是你写的const char*&
(又名char const*&
)。
【讨论】:
感谢您撰写此答案。这比简单地指出语法错误并显示修复更有用。这个答案提出了一种避免const
被放置到西方而产生的各种错误的方法。【参考方案3】:
立即解决编译错误:
struct Derived : Base<char *>
void foo(char* const& t) override ;
;
const char*
表示指向常量字符的指针,但您需要引用常量字符指针。这和前者不一样,需要const
-qualifier的位置不同。
【讨论】:
这将是一个更好的答案,如果它解释了为什么 @MooingDuck 只是即时输入和编辑。以上是关于使用 char * 作为模板参数编译错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥将字符串文字传递给 char* 参数有时只是编译器错误?