Проблема со статическими функциями, g ++ говорит, что класс не был объявлен - PullRequest
1 голос
/ 27 мая 2011

Я пытаюсь скомпилировать этот код, и g ++ постоянно говорит мне, что TimeFinder не был объявлен

Заголовочный файл

#ifndef _TIMEFINDER_H
#define _TIMEFINDER_H
#include <vector>
#include "timefinder.cpp"
using namespace std;
class TimeFinder
{
public:
    static vector<int> time_from_name(string filename);
    static int calc_seconds (vector <int> time);

};
#endif

Файл CPP

#include "timefinder.h"
using namespace std;
vector<int> TimeFinder::time_from_name(string filename)//Line 14
{
    //Method Body
}

int TimeFinder::calc_seconds (vector <int> time1)//Line 37
{

    //Method Body
}

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

Редактировать: точные сообщения об ошибках

timefinder.cpp: 14: error: 'TimeFinder'не был объявлен

timefinder.cpp: 37: ошибка:' TimeFinder 'не был объявлен

Edit2: извините, я пока не очень хорош, но яхотел бы поблагодарить всех за их предложения.Надеюсь, благодаря им качество моего кода улучшится.

Ответы [ 2 ]

7 голосов
/ 27 мая 2011

Не делайте этого:

#include "timefinder.cpp"

Вы вводите свои определения в заголовок, чтобы они появлялись перед их объявлениями.

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

0 голосов
/ 27 мая 2011

# include "timefinder.cpp"

Заголовочные файлы обычно не включают свой файл реализации .cpp, а только любой другой файл .h, необходимый для удовлетворения требуемых определений. Обычно это другой путь, когда файлы .cpp включают необходимые файлы .h, необходимые для выполнения зависимостей.

с использованием пространства имен std;

Это также может привести к значительным разрушениям, и его следует избегать в заголовочных файлах. В заголовочных файлах вы всегда должны полностью указывать свои имена в соответствии с их пространством имен. Причина в том, что если вы импортируете этот заголовочный файл в другой файл, который локально определяет тот же символ в их пространстве имен, например, "cout", то и std :: cout, и user :: cout будут конфликтовать и вызывать ошибку компиляции или, что еще хуже, выбрать неправильное определение и позже приведет к ошибке компоновки.

...