template<typename T> struct SomeClass{
void someFunc(const T& data) const {}
};
void testFunc(const int* a) {
SomeClass<int*> some_class;
some_class.someFunc( a);
}
我制作了一个具有非const类型的模板实例。现在,当调用某个函数时,出现以下错误:
error: invalid conversion from ‘const int*’ to ‘int*’
note: initializing argument 1 of ‘void SomeClass<T>::someFunc(const T&) const [with T = int*]’
因此,基本上我的const T&
被视为普通T&
,const
被忽略。为什么?在这种情况下,如何确保编译器将其视为const T&
?
您需要将定义更改为SomeClass<const int*> some_class;
。 T
来自定义,为int*
,编译器在正确地抱怨。
const
不被忽略。将其应用于类型int*
,产生无法修改的int*
,即int* const
。在const int*
中,const
适用于int
,而不适用于指针。也就是说,const int*
指向无法修改的int
。
在testFunc
内部,您最终得到both常量。由于它是用const int*
调用的,因此SomeClass
的特殊化必须为SomeClass<const int*>
。然后,当您呼叫someFunc
时,您得到第二个。实际参数类型为const int* const
。第一个const
适用于int
,第二个const
适用于参数本身,即指针。
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
指针的引用。因此,不能将a
(即const int*
)作为someFunc()
的参数传递,因为指向的const int
可以通过参数data
进行修改。换句话说,常数将丢失。