我目前有
public:
LargerSetPartD(unsigned maxValue);
LargerSetPartD(const LargerSetPartD &); //copy constructor
void printElements(); // prints members
void set_union(const LargerSetPartD &);
bool isMember(unsigned int);
private:
unsigned long Values;
unsigned maxElementValues;
在set_union中 我正在努力
LargerSetPartD *temparray = new LargerSetPartD(maxElementValue);
//this part of the code just saves an old array composed of Values to temparray.
if ( tempArray->isMember(i) || other.isMember(i))
然而,other.isMember(i)无效。我也尝试了其他 - > isMember(i),但这不起作用。我无法触摸/更改公共函数,因此我无法在成员中添加const。我不知道该怎么做。任何帮助,将不胜感激。我得到的错误信息是
passing ‘const LargerSetPartD’ as ‘this’ argument discards qualifiers [-fpermissive]
copy constructor:
LargerSetPartD::LargerSetPartD(const LargerSetPartD &other)
{
Values = other.Values;
maxElementValue = other.maxElementValue;
}
答案 0 :(得分:0)
假设// INSTALL
self.addEventListener('install', function(event) {
console.log('[ServiceWorker] Installed version', version);
event.waitUntil(
caches.open(version).then(function(cache) {
console.log('[ServiceWorker] Cached cachedFiles for', version);
return cache.addAll(cacheFiles);
}).then(function() {
console.log('[ServiceWorker] Skip waiting on install');
return self.skipWaiting();
})
);
});
//ACTIVATE
self.addEventListener('activate', function(event) {
self.clients.matchAll({
includeUncontrolled: true
}).then(function(clientList) {
var urls = clientList.map(function(client) {
return client.url;
});
console.log('[ServiceWorker] Matching clients:', urls.join(', '));
});
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheName !== version) {
console.log('[ServiceWorker] Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
}).then(function() {
console.log('[ServiceWorker] Claiming clients for version', version);
return self.clients.claim();
})
);
});
//RECIEVE DATA FROM JAVASCRIPT FILE
self.addEventListener('message', function(event){
console.log("SW Received Message: " + event.data);
var fullArray = [];
var che = event.data;
fullArray = che.splice(',');
console.log("SWChe2: " + fullArray);
var result = fullArray.slice(1,-1);
caches.open(version + 'Manifest')
.then(function(cache) {
return cache.addAll(result);
});
});
是other
的{{1}}参数,您试图在const LargerSetPartD &
对象上调用非set_union
方法,而不是允许的。
由于您无法更改公共方法的签名,因此可以创建const
的临时非常量副本并在其上调用该方法:
const
答案 1 :(得分:0)
我无法触及/更改公共功能...
这意味着你需要做一些黑客攻击并绕过编译器的检查。如果您被允许修改代码,则可以使用isMember
对const
方法进行限定,如下所示:
public:
...
bool isMember(unsigned int) const;
假设这是有效的(也就是说,假设isMember
确实没有改变它所使用的对象,这在考虑方法名称的情况下是有意义的,你可以&# 34;假"这没有改变头文件。像这样使用const_cast
:
tempArray->isMember(i) // error
const_cast<LargerSetPartD*>(tempArray)->isMember(i) // OK
并且像这样:
other.isMember(i) // error
const_cast<LargerSetPartD&>(other.isMember(i)) // OK
但是,这会打开未来问题的代码(未定义的行为) - 编译器现在不会阻止您更改isMember
方法中的内容。此外,代码看起来很丑陋。因此,最好在需要的地方添加const
。
此外,编译器为您提供了更强大(更危险)的替代方案:
... [-fpermissive]
如果将-fpermissive
添加到编译命令行,编译器将忽略所有const
限定符。这几乎肯定会隐藏危险的错误(你不想做),所以只有在绝对需要时才使用这种方法。