Overloading struct members (or cast?)
Steven Schveighoffer via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Nov 18 11:01:53 PST 2014
On 11/18/14 1:28 PM, Ali Çehreli wrote:
> On 11/18/2014 07:32 AM, Wsdes wrote:
>
> > Error: need 'this' for 'string' of type 'const(char*)'
>
> Reduced:
>
> struct S
> {
> union Value
> {
> const char* myString;
> }
> }
>
> void main()
> {
> auto s = S();
> auto mine = s.Value.myString; // ERROR
> }
>
> You may be thinking that Value introduces a name scope so that you can
> reference its myString by Value.myString.
>
> You have two options:
>
>
> a) Remove Value so that it is an anonymous union. myString becomes a
> direct member of S:
>
> struct S
> {
> union // <-- Anonymous
> {
> const char* myString;
> }
> }
>
> void main()
> {
> auto s = S();
> auto mine = s.myString; // <-- No more Value
> }
>
>
> b) Make S have an actual member of type Value:
>
> struct S
> {
> union Value
> {
> const char* myString;
> }
>
> Value value; // <-- Added
> }
>
> void main()
> {
> auto s = S();
> auto mine = s.value.myString; // <-- Note lower initial
> }
>
> Ali
>
This works in C++:
struct S
{
union
{
const char *myString;
} Value;
};
But the issue is that D does not require the semicolon at the end of the
struct, so by the closing brace, it is done with the union.
the closest solution you can get is the last one you said.
I never even considered that you can't make an anonymous struct or union
type and assign it to a member in D. Not sure if we really need to
support it though.
-Steve
More information about the Digitalmars-d-learn
mailing list