Почему эта программа вызывает operator () вместо конструктора?

Вот программа, которая компилируется без предупреждения, например, на GNU C ++:

$ g++ -o t -Wall -pedantic -Wshadow t.cpp

$ ./t.exe
Calling barney::barney()
Calling foo::operator()()
Calling barney::barney()

Но она полностью не компилируется на MSVC ++:

$ cl /EHsc t.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

t.cpp
t.cpp(17) : error C2380: type(s) preceding 'fred' (constructor with return type, or illegal redefinition of current class-name?)
t.cpp(17) : error C2208: 'fred' : no members defined using this type

Более того, когда она компилируется, результат не такой, как я ожидал. Может ли кто-нибудь пролить свет на то, каким должно быть стандартное поведение этого кода ?

Вот он:

#include 

using ::std::cerr;

struct fred;

struct foo {
   inline fred operator ()();
};

struct barney {
   barney() : v_(0) { cerr << "Calling barney::barney()\n"; }
   int v_;
};

struct fred : public barney {
   foo fred;
   int joe;
   struct fred memfunc() { return fred(); }
};

inline fred foo::operator ()()
{
   cerr << "Calling foo::operator()()\n"; return fred();
}

int main(int argc, const char *argv[])
{
   fred f;
   f.memfunc();
   return 0;
}

Он выводит следующее:

Calling barney::barney()
Calling foo::operator()()
Calling barney::barney()

Но я ожидал этого:

Calling barney::barney()
Calling barney::barney()

Почему я получаю вывод я делаю? Это стандартное поведение? Если да, то почему, какие разделы стандарта имеют отношение к делу?

В дополнение к принятому ответу Дэвид Родригес дал отличный ответ , подробно описав, где в стандарте говорится, что я разрешено объявить член с именем fred из struct fred . Теперь я получаю ошибку «Not Null» при использовании метода save (), потому что created_by пуст. Я попытался добавить ...

У меня есть форма модели, и я исключил два поля: create_date и created_by . Теперь я получаю ошибку «Not Null» при использовании метода save () , потому что created_by пуст.

Я пытался добавить идентификатор пользователя в форму раньше метод save () выглядит следующим образом: form.cleaned_data ['created_by'] = 1 и form.cleaned_data ['created_by_id'] = 1 . Но ничего из этого не работает.

Может кто-нибудь объяснить мне, как я могу "добавить" дополнительные данные для представленной формы модели, чтобы она сохранялась?

class Location(models.Model):
    name = models.CharField(max_length = 100)
    created_by = models.ForeignKey(User)
    create_date = models.DateTimeField(auto_now=True)

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        exclude = ('created_by', 'create_date', )

11
задан Sven van Zoelen 29 April 2011 в 12:11
поделиться