Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
February 11, 2014 Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Here's the gist of what I'm trying to do: struct Foo { public: int i; int j; static opCall(int i)(int j, int k) { return Foo(i+j,i+k); } } void main() { auto bob = Foo!(1)(2,3); //Error: template instance Foo!1 Foo is not a template declaration, it is a struct } I'm trying to template the static opCall function, not the struct. Is there a way to do disambiguate between the two? |
February 11, 2014 Re: Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matthew Dudley | On Tuesday, 11 February 2014 at 00:00:06 UTC, Matthew Dudley wrote: > Here's the gist of what I'm trying to do: > > struct Foo > { > public: > int i; > int j; > > static opCall(int i)(int j, int k) > { > return Foo(i+j,i+k); > } > } > > void main() > { > auto bob = Foo!(1)(2,3); //Error: template instance Foo!1 Foo is not a template declaration, it is a struct > } > > > I'm trying to template the static opCall function, not the struct. Is there a way to do disambiguate between the two? Welcome to my world ;) http://forum.dlang.org/thread/hdocnxglxmfpacnpmouh@forum.dlang.org |
February 11, 2014 Re: Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Namespace | I'm not sure that the same ambiguity is here in this case. Since the opCall is static, the only other thing that the template could apply to is the struct, which you can check that it doesn't from the struct definition.
On Tuesday, 11 February 2014 at 00:05:08 UTC, Namespace wrote:
> On Tuesday, 11 February 2014 at 00:00:06 UTC, Matthew Dudley wrote:
>> Here's the gist of what I'm trying to do:
>>
>> struct Foo
>> {
>> public:
>> int i;
>> int j;
>>
>> static opCall(int i)(int j, int k)
>> {
>> return Foo(i+j,i+k);
>> }
>> }
>>
>> void main()
>> {
>> auto bob = Foo!(1)(2,3); //Error: template instance Foo!1 Foo is not a template declaration, it is a struct
>> }
>>
>>
>> I'm trying to template the static opCall function, not the struct. Is there a way to do disambiguate between the two?
>
> Welcome to my world ;)
> http://forum.dlang.org/thread/hdocnxglxmfpacnpmouh@forum.dlang.org
|
February 11, 2014 Re: Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Namespace | On Tue, Feb 11, 2014 at 1:05 AM, Namespace <rswhite4@googlemail.com> wrote: >> static opCall(int i)(int j, int k) >> { >> return Foo(i+j,i+k); >> } >> auto bob = Foo!(1)(2,3); //Error: > Welcome to my world ;) http://forum.dlang.org/thread/hdocnxglxmfpacnpmouh@forum.dlang.org Did you try using a templated constructor? |
February 12, 2014 Re: Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Philippe Sigaud | On Tuesday, 11 February 2014 at 19:15:25 UTC, Philippe Sigaud wrote:
> On Tue, Feb 11, 2014 at 1:05 AM, Namespace <rswhite4@googlemail.com> wrote:
>
>>> static opCall(int i)(int j, int k)
>>> {
>>> return Foo(i+j,i+k);
>>> }
>
>>> auto bob = Foo!(1)(2,3); //Error:
>
>> Welcome to my world ;)
>> http://forum.dlang.org/thread/hdocnxglxmfpacnpmouh@forum.dlang.org
>
> Did you try using a templated constructor?
Like this?
this(int i)(int j, int k)
{
this.i = i + j;
this.j = i + k;
}
Same error.
|
February 12, 2014 Re: Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matthew Dudley | On Tuesday, 11 February 2014 at 00:00:06 UTC, Matthew Dudley
wrote:
> Here's the gist of what I'm trying to do:
>
> struct Foo
> {
> public:
> int i;
> int j;
>
> static opCall(int i)(int j, int k)
> {
> return Foo(i+j,i+k);
> }
> }
>
> void main()
> {
> auto bob = Foo!(1)(2,3); //Error: template instance Foo!1 Foo is not a template declaration, it is a struct
> }
>
>
> I'm trying to template the static opCall function, not the struct. Is there a way to do disambiguate between the two?
You can't do this! you are calling Foo as if it is a template...
hence the error!
Maybe the only solution is a new symbol such as
Foo!!(1)(2,3)
where !! tells the compiler that you are referencing an implicit
function call and not a template. Would be an easy solution.
|
February 12, 2014 Re: Templated static opCall in non-templated struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Frustrated | On Wednesday, 12 February 2014 at 01:59:54 UTC, Frustrated wrote:
> On Tuesday, 11 February 2014 at 00:00:06 UTC, Matthew Dudley
> wrote:
>> Here's the gist of what I'm trying to do:
>>
>> struct Foo
>> {
>> public:
>> int i;
>> int j;
>>
>> static opCall(int i)(int j, int k)
>> {
>> return Foo(i+j,i+k);
>> }
>> }
>>
>> void main()
>> {
>> auto bob = Foo!(1)(2,3); //Error: template instance Foo!1 Foo is not a template declaration, it is a struct
>> }
>>
>>
>> I'm trying to template the static opCall function, not the struct. Is there a way to do disambiguate between the two?
>
> You can't do this! you are calling Foo as if it is a template...
> hence the error!
>
> Maybe the only solution is a new symbol such as
>
> Foo!!(1)(2,3)
>
> where !! tells the compiler that you are referencing an implicit
> function call and not a template. Would be an easy solution.
Well since Foo isn't templated, shouldn't the compiler know to apply the template to the function?
|
Copyright © 1999-2021 by the D Language Foundation