c++ - 如何对模板类型强制执行常量?
问题描述
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&
?
解决方案
您可能要考虑部分专门化您的类模板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
a 的const int*
, 作为参数传递给 ,someFunc()
因为指向const int
的参数可以通过参数 进行修改data
。换句话说,常数会丢失。
推荐阅读
- eclipse - 如何在 Eclipse 比较视图中更改颜色
- powershell - 将文档写入 Domino 数据库的 Powershell 脚本
- python - Python - openpyxl wb.save() 抛出 TypeError
- arrays - 将字符串添加到空数组会给出“NAN”
- sql - 同一列的多个 LEFT JOINS
- angularjs - 不使用 acquireTokensilent 获取令牌,但使用 acquireTokenpopup Msal-browser 获取令牌
- azure - 如何正确配置 Azure DNS 以将所有流量路由到 CDN 配置文件
- javascript - 如何将回调函数(带有http请求)从父组件传递到Angular中的子组件
- python - django:外键约束失败
- powershell - 在当前 PowerShell 终端中启动程序