Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
August 08, 2018 variable _param_0 cannot be read at compile time | ||||
---|---|---|---|---|
| ||||
Why this is a error ? ``` struct S { bool v; string x; } S* add(A...)(ref A a) { __gshared s = S(a); return &s; } void main(){ auto p = add(true); } ``` test.d(9): Error: variable _param_0 cannot be read at compile time test.d(14): Error: template instance `test.add!bool` error instantiating test.d(14): Error: function test.add!bool.add(ref bool _param_0) is not callable using argument types (bool) test.d(14): cannot pass rvalue argument true of type bool to parameter ref bool _param_0 I try pass some into the template to return a __gshared var pointer. the A length is dynamic. |
August 08, 2018 Re: variable _param_0 cannot be read at compile time | ||||
---|---|---|---|---|
| ||||
Posted in reply to learnfirst1 | On Wednesday, 8 August 2018 at 12:57:43 UTC, learnfirst1 wrote:
> Why this is a error ?
>
this code example can explain what I am try to do here:
struct M {
int i;
S*[100] s;
}
struct S {
M* mp;
bool x;
}
S* add(A...)(ref A a) {
__gshared s = S(a);
alias m = a[0];
m.s[m.i++] = &s;
return &s;
}
void main(){
__gshared M m = M(0);
__gshared S s = S(&m, false);
m.s[m.i++] = &s;
auto p = add(&m, true); // variable _param_0 cannot be read at compile time
}
because S has the optional ctor parameters, I can not use template alias param here( some how not work) .
|
August 08, 2018 Re: variable _param_0 cannot be read at compile time | ||||
---|---|---|---|---|
| ||||
Posted in reply to learnfirst1 | On Wednesday, 8 August 2018 at 12:57:43 UTC, learnfirst1 wrote: > Why this is a error ? > > ``` > struct S { > bool v; > string x; > } > > S* add(A...)(ref A a) { > __gshared s = S(a); > return &s; > } > > void main(){ > auto p = add(true); > } > ``` > > test.d(9): Error: variable _param_0 cannot be read at compile time __gshared and static need to be initialized with a value known at compile-time. You're trying to give it a run-time value. You can set this after it's first created: S* add(A...)(ref A a) { __gshared S s; s = S(a); return &s; } That's a little kludgy, but apparently that's how it be. You also get another error message: > Error: function test.add!bool.add(ref bool _param_0) is not callable using argument types (bool) That's because add takes its arguments by ref, and true is a literal that has no canonical address, and thus can't be passed by ref. You might consider using auto ref. -- Simen |
August 09, 2018 Re: variable _param_0 cannot be read at compile time | ||||
---|---|---|---|---|
| ||||
Posted in reply to Simen Kjærås | On Wednesday, 8 August 2018 at 13:13:42 UTC, Simen Kjærås wrote:
> On Wednesday, 8 August 2018 at 12:57:43 UTC, learnfirst1 wrote:
>> Why this is a error ?
>>
>> ```
>> struct S {
>> bool v;
>> string x;
>> }
>>
>> S* add(A...)(ref A a) {
>> __gshared s = S(a);
>> return &s;
>> }
>>
>> void main(){
>> auto p = add(true);
>> }
>> ```
>>
>> test.d(9): Error: variable _param_0 cannot be read at compile time
>
> __gshared and static need to be initialized with a value known at compile-time. You're trying to give it a run-time value. You can set this after it's first created:
>
> S* add(A...)(ref A a) {
> __gshared S s;
> s = S(a);
> return &s;
> }
>
> That's a little kludgy, but apparently that's how it be.
>
> You also get another error message:
>> Error: function test.add!bool.add(ref bool _param_0) is not callable using argument types (bool)
>
> That's because add takes its arguments by ref, and true is a literal that has no canonical address, and thus can't be passed by ref. You might consider using auto ref.
>
> --
> Simen
is there a way to pass A a... as alias into template ? so the code can be just like this:
__gshared S s = S(&m, false);
the binary size is short since in this case the s is static build int. and run a bit fast.
|
August 09, 2018 Re: variable _param_0 cannot be read at compile time | ||||
---|---|---|---|---|
| ||||
Posted in reply to learnfirst1 | struct M { int i; S*[100] s; } struct S { M* mp; bool x; } S* add(A...)() { alias m = A[0]; __gshared s = S(&m,A[1..$]); m.s[m.i++] = &s; return &s; } void main(){ __gshared M m = M(0); __gshared S s = S(&m, false); m.s[m.i++] = &s; auto p = add!(m, true); } |
August 10, 2018 Re: variable _param_0 cannot be read at compile time | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kagamin | On Thursday, 9 August 2018 at 13:42:03 UTC, Kagamin wrote:
> struct M {
> int i;
> S*[100] s;
> }
> struct S {
> M* mp;
> bool x;
> }
>
> S* add(A...)() {
> alias m = A[0];
> __gshared s = S(&m,A[1..$]);
> m.s[m.i++] = &s;
> return &s;
> }
>
> void main(){
> __gshared M m = M(0);
> __gshared S s = S(&m, false);
> m.s[m.i++] = &s;
> auto p = add!(m, true);
> }
this is what I want! thanks.
|
Copyright © 1999-2021 by the D Language Foundation