Struct не может использовать конструктор при использовании с __declspec (dllexport) - PullRequest
1 голос
/ 11 января 2011

Я пытаюсь определить конструктор для C ++ struct, и по совпадению, это также структура, которую я хочу экспортировать. Итак, вот мой код:

extern "C"__declspec(dllexport) typedef struct
{
    double x;
    double y;

    PointCg(double xx, double yy);
}PointCg;

Однако я получил ошибку компиляции, говорящую, что

ошибка C4430: отсутствует указатель типа- Int предполагается. Примечание: C ++ не поддержка default-int

Но я думаю, что это совершенно правильное заявление?

Я использую visual-c ++ 2008, если это важно для вас.

Ответы [ 3 ]

3 голосов
/ 11 января 2011

__declspec не имеет к этому никакого отношения.Вы определяете анонимную структуру.Имя typedef не будет работать для определения конструктора.Внутри определения PointCg просто выглядит как имя функции, и функции должны иметь возвращаемый тип.Вот как вы определяете структуру в C ++:

struct PointCg{
   //....
   PointGc(double xx, double yy);
};

В отличие от C, вам не нужно вводить имена структур для определения, чтобы не печатать везде struct, а просто использовать PointCg вместо struct PointCg при ссылке на этот тип.

2 голосов
/ 11 января 2011

typedefs - это просто псевдонимы базового типа.Это подразумевает, что typedefs - это время компиляции, а не конструкция времени компоновки.

В вашем примере кода вы пытаетесь dllexport typedef анонимной структуры, что может привести к путанице компилятора на двух уровнях: первыйвы экспортируете псевдоним, который он не хочет делать, и затем сама структура является анонимной, поэтому она даже не может экспортировать это.В-третьих, вещь, похожая на конструктор, - нет.Это просто функция со странным именем.У ctor должно быть имя структуры и, ну, в общем, его аноним.

Учитывая, что этот вопрос - c ++, который ослабил многие правила при использовании структур ... почему бы вам просто не пропустить typedef и датьструктура имя:

extern "C"__declspec(dllexport) struct PointCg
{
  double x;
  double y;
  PointCg(double xx, double yy);
};
1 голос
/ 11 января 2011

ошибка C4430: предполагается спецификатор типа затуманивания int. Примечание: C ++ не поддерживает default-int

Это чаще всего означает, что вы ввели имя, которое еще ничего не значит для компилятора. И действительно, я верю, что это так. Вы используете древнюю технику C для определения структуры: typedef struct. Когда компилятор попадает в конструктор вашей (пока не названной) структуры, имя PointCg ничего не значит. Это ничего не значит, пока typedef не будет назван после закрывающего }.

Я предлагаю вам изменить код следующим образом:

extern "C"__declspec(dllexport) struct PointCg
{
    double x;
    double y;

    PointCg(double xx, double yy);
};

В C ++ буквально никогда нет причин использовать старую технику typedef struct. Это только причиняет боль и замешательство и ничего не дает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...