Неразрешенный внешний символ с очень простым классом (VS2010)

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

Ситуация следующая: у меня есть один проект Visual Studio 2010. Этот проект находится в решении Visual Studio 2010. В проекте есть следующие файлы:

доп.ч:

class Adder {
public:
    static int add(int i1, int i2);
};

добавить.cpp:

class Adder {
public:
    static int add(int i1, int i2) {
        return i1 + i2;
    }
};

основной.cpp:

#include "add.h"

int main() {
    Adder::add(5, 6);
    return 0;
}

При попытке запустить этот код, который мне кажется довольно простым, я получаю следующую ошибку компоновщика:

main.obj : error LNK2019: unresolved external symbol "public: static int __cdecl Adder::add(int,int)" (?add@Adder@@SAHHH@Z) referenced in function _main

Насколько я понял, это означает, что компоновщик не смог найти реализацию Adder::add(). Однако файлы находятся в одном и том же проекте, сгенерированные файлы .obj находятся в одной и той же папке, и каждый учебник, который я читал по теме классов и файлов заголовков, говорит мне, что это должно работать.

До сих пор я пробовал следующие потенциальные решения:

  • Добавьте собственную папку проекта в дополнительные файлы include/dependencies/sources/whatever.
  • Добавляйте внешние идентификаторы к разным вещам
  • Используйте отдельное пространство имен
  • Различные другие небольшие корректировки в надежде, что они будут работать.

Итак, я думаю, моя проблема сводится к следующему: как я могу заставить компоновщика заметить файл add.cpp? Любая помощь приветствуется, я безуспешно потратил на это несколько часов, хотя мне это кажется чрезвычайно простой вещью.


person Jan Janssen    schedule 05.12.2012    source источник


Ответы (1)


Следующее определяет совершенно новый класс

//add.cpp:
class Adder {
public:
    static int add(int i1, int i2) {
        return i1 + i2;
    }
};

отличный от указанного в шапке, доступный только для данной единицы перевода ("add.cpp").

Что он должен содержать:

//add.cpp
#include "add.h"
int Adder::add(int i1, int i2) {
    return i1 + i2;
}

Это реализует метод, определенный в классе из заголовка add.h.

person Luchian Grigore    schedule 05.12.2012
comment
Спасибо за ваш ответ, это действительно решило мою проблему, хотя я думаю, что это похоже на обходное решение. Существуют ли другие методы разделения классов на отдельные файлы, которые обычно используются, или это наиболее используемый/удобный? - person Jan Janssen; 05.12.2012
comment
@JanJanssen это единственный способ разделить классы на файлы заголовков и реализации. - person Luchian Grigore; 05.12.2012