C ++ неизвестный тип имени - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть заголовочный файл, определяющий некоторые параметры. Я определил некоторые параметры как внешние. Моя программа отлично работает с другими типами данных, такими как double и int, за исключением случаев, когда я пытаюсь добавить векторные переменные. Объявление в заголовочном файле:

extern std::vector<double> my_vec;

В моем основном файле я строю вектор, используя этот код:

std::vector<double> my_vec(3,0);

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

P.S. Первоначально я пытался присвоить некоторые значения этому вектору, используя:

my_vec[0] = 1;

но компилятор говорит, что C ++ требует спецификатора типа для всех объявлений. Я погуглил эту ошибку, но я не понимаю, потому что я указываю тип my_vec.

Редактировать: пример:

main.cpp
#include "params.h"
#include <vector>

std::vector<double> my_vec(3,0);

my_vec.clear();
// edit: my_vec[0] = 1; this also produces an error

int main(){
    return 0;
}

params.h
#include <vector>

extern std::vector<double> my_vec;

Сообщение об ошибке:

main.cpp:6:1: error: unknown type name 'my_vec'
my_vec.clear();
^
main.cpp:6:7: error: cannot use dot operator on a type
my_vec.clear();
      ^
2 errors generated.

1 Ответ

0 голосов
/ 10 ноября 2018

Вы не можете выполнять операторы вне функции - это то, что вы пытаетесь сделать с my_vec.clear();. Неважно, что clear() является методом векторного класса - вызов метода (в отличие от построения переменной) является оператором, как и x = 1;. Они принадлежат функциям.

Вы должны поместить свое заявление где-то в вашем main(), например ::

int main(){
    my_vec.clear();
    return 0;
}

или убедитесь и создайте my_vec так, как вы хотите, чтобы он выглядел, для начала.

Кроме того, в общем случае вам следует избегать глобальных переменных, если они действительно не нужны. И - вы очень редко делаете. См:

Являются ли глобальные переменные плохими?

Редактировать: ОП спрашивает, можем ли мы как-то обойти это ограничение. Во-первых, вы действительно не должны (посмотрите, что я только что сказал). Но это возможно: мы можем использовать статический блок , который реализуется на C ++, вроде.

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