繁体   English   中英

使用 char * 作为模板参数编译错误

[英]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;

Tchar * ,则 function 类型不是const char * const适用于T ,所以你真正拥有的是char * const 这意味着您需要覆盖的 function

void foo(char* const& t) override {};

West const 最差 const 东 const 最佳 const

const 适用于其左侧的类型部分。 当且仅当其左侧没有任何东西(或支架或其他 scope 限制器)时,它才适用于其右侧的东西。

East const 是指习惯性地将 const 放在您想要 const 的东西的右侧(东)。

West const 是把 const 放在左边的习惯。

west const 的问题在于

const char*

实际上是

char const*

不是

char* const

这是你的错误的来源。

在 west const 样式中,当Tchar*时, const Tchar*const 奇怪。

在东部 const 样式中, Tchar*时的 T T constchar*const 一点也不奇怪。

所以当Tchar*时 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM