2014-12-17 3 views
-2

Сегодня я оценивал D, и я немного экспериментировал с языком, и я сразу же столкнулся с segfault.Segfault при использовании шаблонов с шаблонами

import std.stdio; 
import std.typecons; 
class Foo(T){ 
public: 
    T i; 
} 
class Bar{ 
public: 
    int hello = 0; 
} 

void main() 
{ 
    Foo!(Bar) f; 
    int i = f.i.hello; 
} 

Почему этот код segfault?

+1

Не знаю, почему это было приостановлено, это совершенно правильный вопрос. –

ответ

4

В классах D по умолчанию используются ссылочные типы и инициализируются нулем. Таким образом, ваша переменная «f» по умолчанию равна null, и даже «f» не имеет значения null, Foo! (Bar) .i по умолчанию также имеет значение null.

Вам нужно будет инициализировать их с помощью функции auto f = new Foo! (Bar)() 'и инициализировать' i = new T() 'в конструкторе Foo.

Структуры, с другой стороны, являются типами значений по умолчанию и имеют нулевой инициализатор по умолчанию.