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的方法。