I'm trying to make a more thread-safe wrapper for AA's:
```
synchronized final class SyncAA(K, V) ///
{
///
V opIndex(K key) { return data_[key]; }
///
V opIndexAssign(V value, K key) { return data_[key] = value; }
///
K[] keys() const { return data_.keys; }
///
void remove(K key) { data_.remove(key); }
/// There is no `in` operator, it would not be thread-safe.
V get(K key, lazy V defaultValue=V.init)
{
auto p = key in data_;
return p ? *p : defaultValue;
}
///
int opApply(scope int delegate(inout ref V) dg) const
{
int result = 0;
foreach (value; data_) {
result = dg(value);
if (result)
break;
}
return result;
}
///
int opApply(scope int delegate(K, inout ref V) dg) const
{
int result = 0;
foreach (key, value; data_) {
result = dg(key, value);
if (result)
break;
}
return result;
}
private:
V[K] data_;
}
```
In another file:
`__gshared serverListCache = new SyncAA!(string, ServerList);`
I'm using `keys` in a regular function, this is the error i get:
C:\prog\dmd\windows\bin\..\..\src\druntime\import\object.d(3245,36): Error:
cannot implicitly convert expression `aa` of type
`shared(const(ServerList[string]))` to `const(shared(ServerList)[string])`
src\syncaa.d(17,36): Error: template instance
`object.keys!(shared(const(ServerList[string])),
shared(const(ServerList)), string)` error instantiating
src\serveractions.d(45,33): instantiated from here:
`SyncAA!(string, ServerList)`
src\serveractions.d(50,17): Error: `shared` `const` method
`syncaa.SyncAA!(string, ServerList).SyncAA.keys` is not callable
using a non-shared mutable object
Error C:\prog\dmd\windows\bin\dmd.exe failed with exit code 1.