我有以下C ++代码:
template<typename T> class AbsClass{
public:
virtual void func(const T elem) = 0;
};
class SolidClass : public AbsClass<char*>{
public:
void func(const char* elem) {cout << elem << endl;}
};
int main(){
SolidClass so;
so.func("xyz");
}
但是,当我尝试在main()中实例化一个SolidClass实例时,编译器(g ++ 4.8.1)一直在抱怨纯虚函数AbsClass::func(const T elem)
尚未实现的错误。如果我将SolidClass的定义更改为以下内容,它将起作用:
class SolidClass : public AbsClass<const char*>{
.......
}
我很困惑,因为我在声明const
时已经有AbsClass::func(const T elem)
个关键字。有人可以帮忙解释一下这个事实吗?
答案 0 :(得分:1)
指针有两种类型的const。首先是你是否可以修改他们指向的数据 - 这个const意味着更多的&#34;只读&#34;。第二个const是指针本身是否是一个常量值 - 即你是否可以指向其他东西。在这种情况下,您的指针const char*
可以更改为指向其他内容。
要使指针保持不变(因此它不能指向其他任何东西),必须在*之后放置一个const。所以要编译它,你的代码应该是:
void func(const char *const elem)
假设您仍然想要它指向的数据,则通过此指针进行只读。您需要将模板参数更改为AbsClass<const char*>
如果参数是按值,我通常会避免使它成为const。没有意义,因为无论如何它都被复制了,所以函数的任何局部变化都不重要。
答案 1 :(得分:1)
请记住,const T
== T const
并且更容易看到句法替换在此处不会产生相同的结果。在这种情况下,将char *
作为T
语法中的结果会导致混淆,因为const T
似乎const char *
而T const
是char *const
。实际上,const T
和T const
都会产生char *const
。
static_assert(std::is_same<std::add_const_t<char *>, char *const>::value, "");
答案 2 :(得分:0)
const char*
是指向const char
的指针。你想说char * const
。