class __declspec(dllexport) DI_1
{
DI_1& operator = (DI_1 &){};
};
class DI_2
{
DI_2& operator = (DI_2 &){};
};
int main()
{
DI_1 a;
DI_2 b;
return 0;
}
Следующий код при компиляции с VS 2010/2012
выдает следующую ошибку:
ошибка C4716: ‘DI_1 :: operator =’: должен вернуть значение
в то время как я ожидал, что он вернет ту же ошибку для DI_2
класс тоже.
Эта ошибка компилятора не помечена DI_2
класс тоже как ошибка?
Если нет, кто-нибудь может объяснить причину?
Редактировать:
Я подтвердил с Solaris Compiler, и он выдает ошибку для обоих классов.
Экспорт класса из двоичного модуля не должен иметь никакого значения. В твоем примере я тоже не вижу никакой смысловой разницы.
Тем не менее плохое сообщение об ошибке в несравненной меньшей проблеме, а не в неправильной генерации кода. Каждый разумный разработчик компилятора будет следовать этому правилу. Это объяснение.
постскриптум Во время создания шаблона генерируются только те методы, которые вызываются. Другие методы (и возможные синтаксические ошибки в них) игнорируются. Наоборот, для классов AFAIK обычно все методы генерируются. Я не знаю веских причин для этой асимметрии. Может быть, компилятор MS делает что-то в этом направлении.
Других решений пока нет …