假设我有这个简化的类:
class A {
this(const char* result)
{
this.result = result;
}
private:
union{
const char** results;
const char* result;
}
}
编译因constructor app.A.this missing initializer for const field results
而失败。我知道如果我在union定义中删除const
限定符,我可以编译它,但我知道成员是const。
编辑:
当我将代码更改为:
时class A {
this(const char* result)
{
this.U.result = result;
}
private:
union U {
const char** results;
const char* result;
}
}
我收到另一个错误:Error: need 'this' for 'result' of type 'const(char*)'
。
BTW,我使用的是dmd v2.068.2
答案 0 :(得分:2)
最简单的就是初始化它:
this.results = null;
this.result = result;
请务必先设置您不使用的那些,因为您不想用null覆盖联合!
您也可以将其命名为联盟:
union A{
const char** results;
const char* result;
}
A a;
this(const char* result)
{
this.a.result = result;
}
然后编译器意识到它们都是一个字段,只要求初始化一次。
我认为这可能是一个错误,你的代码不起作用......看起来编译器以同样的方式处理匿名联合和结构,然后联合应该是不同的,因为一个变量覆盖了它们。 / p>
但是简单地设置两者的工作原理使得我现在的工作方式如此。编辑:实际上,我认为我更喜欢命名的联合选项。然后更明显的是,他们在稍后阅读代码时会在一起。
答案 1 :(得分:1)
我认为你的代码没有意义。我猜你对const的使用是错误的。
class A {
this(const(char)* result)
{
this.result = result;
}
private:
union
{
const(const(char)*)* results; // maybe const(char)** results
const(char)* result;
}
}
或者你可以删除union:
class A {
this(const char* result)
{
this.result = result;
}
private:
const char* result;
}
因为const char** result
无论如何都无法改变。