首页 > 解决方案 > 如何对模板类型强制执行常量?

问题描述

template<typename T> struct SomeClass{

    void someFunc(const T& data) const {}

};

void testFunc(const int* a) {

    SomeClass<int*> some_class;

    some_class.someFunc( a);

}

我制作了一个非常量类型的模板实例。现在,当调用某个函数时,我收到错误消息:

error: invalid conversion from ‘const int*’ to ‘int*’
note: initializing argument 1 of ‘void SomeClass<T>::someFunc(const T&) const [with T = int*]’

所以基本上 myconst T&被视为 plain T&, theconst被忽略。为什么?在这种情况下,我如何确保编译器将其视为const T&

标签: c++templatesconstants

解决方案


您可能要考虑部分专门化您的类模板SomeClass,因为案例T是一个指针。然后,添加const指向的类型而不是指针本身(即指向 const的指针而不是const 指针):

template<typename T> struct SomeClass<T*> {
   void someFunc(const T* &data) const { /* ... */ } 
};

SomeClass<int*>::someFunc()(即T = int*)将被实例化为:

void someFunc(const int* &data) const;

data以上是对指向的指针的引用const int。但是,使用您的主模板,SomeClass<int*>::someFunc()实际上是:

void someFunc(int* const &data) const;

也就是说,data这里是对指向 的const指针的引用int。因此,您不能将作为aa 的const int*, 作为参数传递给 ,someFunc()因为指向const int的参数可以通过参数 进行修改data。换句话说,常数会丢失。


推荐阅读