Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以char*作为模板参数的编译错误_C++_Templates - Fatal编程技术网

C++ 以char*作为模板参数的编译错误

C++ 以char*作为模板参数的编译错误,c++,templates,C++,Templates,有人能告诉我这个代码有什么问题吗 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 {}; }; 模板 阶级基础 { 公众: 虚空foo(con

有人能告诉我这个代码有什么问题吗

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 {};
};
模板
阶级基础
{
公众:
虚空foo(const T&T)=0;
虚拟~Base(){}
};
派生结构:基{
void foo(const char*&t)重写{};
};
我得到编译错误

void-Derived::foo(const-char*&)'标记为'override',但不重写


为什么
char*
不是有效的模板参数?

要立即解决编译错误:

struct Derived : Base<char *> {
    void foo(char* const& t) override {};
};
struct-Derived:Base{
void foo(char*const&t)重写{};
};

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

要立即解决编译错误:

struct Derived : Base<char *> {
    void foo(char* const& t) override {};
};
struct-Derived:Base{
void foo(char*const&t)重写{};
};
const char*
表示指向常量字符的指针,但您需要一个指向常量字符指针的引用。这与前者不同,需要不同的
const
-限定符的位置。

当您有

virtual void foo(const T & t) = 0;
T
char*
,则函数类型不是
const char*
const
适用于
T
,因此您真正拥有的是一个
char*const
。这意味着您的重写函数需要

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

virtual void foo(const T & t) = 0;
T
char*
,则函数类型不是
const char*
const
适用于
T
,因此您真正拥有的是一个
char*const
。这意味着您的重写函数需要

void foo(char* const& t) override {};
西常数最差常数东常数最佳常数 常量应用于类型左侧的部分。当且仅当其左侧没有任何内容(或支架或其他范围限制器)时,它才适用于其右侧的内容

East const指习惯性地将const放在你想要的东西的右边(东方)

西常量是将常量放在左边的习惯

西康斯特的问题是

const char*
实际上是

char const*
不是

这就是你的bug的来源

在west const样式中,
const T
T
char*
char*const
时。令人惊讶

在east const样式中,
T const
T
char*
char*const
时。一点也不奇怪

所以当
T
char*
char*const&
,而不是
const char*&
(又名
char-const*&
)时,就像你写的那样 常量应用于类型左侧的部分。当且仅当其左侧没有任何内容(或支架或其他范围限制器)时,它才适用于其右侧的内容

East const指习惯性地将const放在你想要的东西的右边(东方)

西常量是将常量放在左边的习惯

西康斯特的问题是

const char*
实际上是

char const*
不是

这就是你的bug的来源

在west const样式中,
const T
T
char*
char*const
时。令人惊讶

在east const样式中,
T const
T
char*
char*const
时。一点也不奇怪



所以当
T
char*
char*const&
,而不是
const-char*&
(又称
char-const*&
)的时候,当
T是
char*const&
的时候,你就写了。

打字:你需要写
char*const&T
const(char*)
char*const
,而不是
const-char*
const-char*
=
char-const*
你想要的
char*const
。编辑我打字太慢了…@Justin不,我不认为对东康斯特和西康斯特风格的混淆,以及由此产生的错误算是一个打字错误。@cigien Fair enoughEast康斯特,西康斯特,我们是如何逃脱这样的事情的,“!那些东康斯特戴着莱纳斯·托瓦尔兹的帽子。把船员们召集起来。让他们付出代价!”打字错误:您需要编写
char*const&t
const(char*)
char*const
,而不是
const-char*
const-char*
=
char-const*
你想要的
char*const
。编辑我打字太慢了…@Justin不,我不认为对东康斯特和西康斯特风格的混淆,以及由此产生的错误算是一个打字错误。@cigien Fair enoughEast康斯特,西康斯特,我们是如何逃脱这样的事情的,“!那些东康斯特戴着莱纳斯·托瓦尔兹的帽子。把船员们召集起来。让他们付出代价!”如果能解释的话,这将是一个更好的答案why@MooingDuck只是在运行中输入和编辑。如果能解释一下,这将是一个更好的答案why@MooingDuck只需快速输入和编辑。似乎是插入east const样式的理想场所:)@cigien抱歉,我住在中西部;)似乎是一个理想的地方插入东康斯特风格:)@cigien对不起,我住在中西部;)谢谢你写下这个答案。这比简单地指出语法错误并显示修复更有用。这个答案提供了一种方法,可以避免因
const
被放置在西方而产生的各种各样的bug。谢谢你写下这个答案。这比简单地指出语法错误并显示修复更有用。这个答案提供了一种避免因
const
被放置在西方而产生各种各样的bug的方法。