"is not callable using a non-shared object"
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Dec 10 15:53:20 PST 2015
On 12/10/2015 02:07 PM, Entity325 wrote:
> Both threads need to be able to run asynchronously themselves, so message
> passing using std.concurrency isn't an option.
I can still imagine a case where the receiver checks the message queue
with a timeout of 0, which is non-blocking.
> My problem is: every time I try to declare a shared object in D from a
> non-shared memory space, I get a compiler error: [object] is not callable
> using a non-shared object.
Instead of "[object]", the message actually contains a member function
name, right? If so, here is a reduction:
class C {
void foo() shared { // <-- note shared
}
}
void main() {
auto c = new C();
c.foo();
}
Error: shared method deneme.C.foo is not callable using a non-shared object
But that's the reverse of what you said: In my case I am constructing a
non-shared object. Here is another one where the whole class is shared:
shared class C { // <-- note shared
void foo() {
}
}
void main() {
auto c = new C();
c.foo();
}
> most frustrating was the guy who responded to a similar inquiry with
"Have
> you checked out std.parallelism and std.concurrency?" Cute.
Perhaps that was me because it is always at the tip of my lips. :) The
response is valuable because there are so many problems with
data-sharing concurrency.
> 1: attempting to assign a shared object to a non-shared memory
> space(easy to fix)
I can't reproduce the same error message with that one.
> 2: attempting to assign a non-shared object to a shared memory
> space(less easy to fix, but still not bad)
Ditto.
> 3: attempting to assign a shared object to a shared memory space from
> within a non-shared memory space(no clue)
I don't think these are about assignment.
> 4: attempting to create a shared object from within a non-shared memory
> space(how am I supposed to create shared objects if I can't do it from a
> non-shared space?)
In this context 'shared' is like 'const'. You can put that attribute to
individual member functions, including the constructor:
import std.stdio;
class C {
this(int i) {
writefln("Constructing non-shared with %s", i);
}
this(int i) shared {
writefln("Constructing shared with %s", i);
}
}
void main() {
auto c = new C(1);
auto c2 = new shared(C)(2);
}
Constructing non-shared with 1
Constructing shared with 2
Ali
More information about the Digitalmars-d-learn
mailing list