模板参数中的Const关键字

时间:2014-06-30 21:52:17

标签: c++ templates const virtual-functions

我有以下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)个关键字。有人可以帮忙解释一下这个事实吗?

3 个答案:

答案 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 constchar *const。实际上,const TT const都会产生char *const

static_assert(std::is_same<std::add_const_t<char *>, char *const>::value, "");

答案 2 :(得分:0)

const char*是指向const char的指针。你想说char * const