使用 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&amp; tconst (char*)char *const,而不是 const char* const char* = char const* 你想要char* const。编辑我打字太慢了... @Justin 不,我不认为混淆east-const 和west-const 样式,以及由此产生的错误,算作错字。 @cigien 够公平 East const,west const,我们是如何设法逃脱诸如“之类的东西的!那些东部const 人封住了Linus Torvalds。召集所有工作人员。去 >让他们付钱!” 【参考方案1】:

当你有

virtual void foo(const T & t) = 0;

Tchar *,则函数类型不是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 TTchar* 时为char*const。令人惊讶。

在东部 const 样式中,T constTchar* 时为char*const。一点也不奇怪。

所以T const&amp;Tchar*char*const&amp;,而不是你写的const char*&amp;(又名char const*&amp;)。

【讨论】:

感谢您撰写此答案。这比简单地指出语法错误并显示修复更有用。这个答案提出了一种避免const 被放置到西方而产生的各种错误的方法。【参考方案3】:

立即解决编译错误:

struct Derived : Base<char *> 
    void foo(char* const& t) override ;
;

const char* 表示指向常量字符的指针,但您需要引用常量字符指针。这和前者不一样,需要const-qualifier的位置不同。

【讨论】:

这将是一个更好的答案,如果它解释了为什么 @MooingDuck 只是即时输入和编辑。

以上是关于使用 char * 作为模板参数编译错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥将字符串文字传递给 char* 参数有时只是编译器错误?

STL容器作为函数中的模板参数,调用错误

模板模板参数和模板别名:编译器错误?

在 Visual Studio 2019 中使用枚举作为模板参数时出现错误 C2440 和 C2973

深入理解函数模板

为啥将 lambda 传递给受约束的类型模板参数会导致“不完整类型”编译器错误?