Ошибка «Ожидаемый список спецификаторов-спецификаторов перед» в конструкторе структуры - PullRequest
1 голос
/ 07 декабря 2010

Я пытаюсь написать некоторый код для оптимизации некоторых функций Open GL для программы, которую пишу, к сожалению, я не совсем ветеран C или C ++, но отчасти поэтому я делаю этот проект!

Итак, я создаю структуру для обработки матриц 3х3 и определяю структуру следующим образом:

#ifndef MATRIX3BY3_H
#define MATRIX3BY3_H
struct Matrix3by3
{
    float ix, jx, kx;
    float iy, jy, ky;
    float iz, jz, kz;

    Matrix3by3() {}

    Matrix3by3(const Matrix3by3 &matrix)
    {
        ix = matrix.ix;
        jx = matrix.jx;
        kx = matrix.kx;

        iy = matrix.iy;
        jy = matrix.jy;
        ky = matrix.ky;

        iz = matrix.iz;
        jz = matrix.jz;
        kz = matrix.kz;
    }

    Matrix3by3 (const float _ix, const float _jx, const float _kx,
                const float _iy, const float _jy, const float _ky,
                const float _iz, const float _jz, const float _kz) :
        ix(_ix), jx(_jx), kx(_kx),
        iy(_iy), jy(_jy), ky(_ky),
        iy(_iz), jx(_jz), kz(_kz) {}
    }; 
#endif

И я получаю ошибку (дважды)

Ожидаетсяспецификатор-список-спецификатор перед 'Matrix3by3'

В строке первого конструктора.Я попытался найти ответы на эти вопросы, и, похоже, это связано с тем, что компилятор не знает, что это тип.Итак, я попробовал следующее, я уберу внутренности для краткости:

typedef struct Matrix3by3 { ... };

struct Matrix3by3 { struct Matrix3by3() {} ... };

struct Matrix3by3 { ... } Matrix3by3;

typdef struct Matrix3by3;
struct Matrix3by3 { ... };

Какие решения были предложеныв блогах и статьях, которые я видел по этой ошибке.Я также видел, что это может возникнуть из-за циклической зависимости, но в этом файле нет включений, включающих что-либо еще, и я даже удалил их, просто чтобы быть уверенными время от времени - без изменений.

IЯ мог бы написать это в классе Objective-C, я уверен, но это, вероятно, потребует чуть больше памяти и циклов, и это именно то, чего я пытаюсь избежать.Единственное, о чем я могу подумать, это некоторые настройки компилятора / проекта, которые я установил по умолчанию, что препятствует использованию такого типа структуры.Вполне возможно, так как я изучаю язык / среду.

Может ли кто-нибудь помочь?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 07 декабря 2010

C не поддерживает конструкторы или функции-члены структур. Вы не сможете заставить его скомпилировать как C или Objective-C. Вам нужно скомпилировать это как C ++ или Objective-C ++, после чего он будет почти скомпилирован: у вас есть ошибка в вашем третьем конструкторе, в которой вы пытаетесь инициализировать элементы iy и jx несколько раз. Как только вы исправите эти опечатки, он прекрасно скомпилируется.

1 голос
/ 07 декабря 2010

На какой язык / компилятор вы переводите свою программу? Я предполагаю, что вы пытаетесь скомпилировать код как C, в то время как языковые возможности, которые вы пытаетесь использовать, строго специфичны для C ++.

1 голос
/ 07 декабря 2010
typedef struct { ... } Matrix3by3;

должно работать. Он объявляет анонимную структуру как тип.

И использовать класс вместо struct:)

0 голосов
/ 07 декабря 2010

Ошибка «Ожидаемый список спецификаторов-спецификаторов перед Matrix3by3» является GCC-измом, и это означает, что токен «Matrix3by3» неизвестен. Это обычно тот случай, когда у вас есть тип, который компилятор не распознает, либо потому, что вы его опечатали, либо потому, что вы забыли заголовок. В вашем случае это потому, что типа "Matrix3by3" действительно не существует. У вас есть два варианта:

  1. Прекратите использовать Matrix3by3 напрямую и вместо этого начните использовать struct Matrix3by3, так как это фактический тип, который вы определили.
  2. Дайте вашей структуре typedef. Это будет выглядеть примерно так:

    typedef struct {
        // fields here
    } Matrix3by3
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...