Ошибка неопределенных символов компоновщика - PullRequest
1 голос
/ 17 августа 2011

Похоже, мои два файла, userinterface.h

#ifndef USERINTERFACE_H
#define USERINTERFACE_H

#include <string>
#include "vocabcollection.h"

namespace user_interface
{
//Finds a file
//
//Returns when user selects a file
std::string findFile();

//more comments followed by functions
}

#endif

и userinterface.cpp,

#include "userinterface.h"
using namespace std;
using namespace user_interface;

string findFile()
{
    return "./";
}

//more placeholder implementations of such functions; void functions have nothing within
//the brackets

выдает мне множество ошибок от компоновщика:

Undefined symbols for architecture x86_64:
make: Leaving directory `longdirectorypath'
  "user_interface::showTestResults(int, int)", referenced from:
      vocabCollection::test()      in vocabcollection.o
  "user_interface::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      addNewCollection()     in mainlogic.o
      loadNewCollection()     in mainlogic.o
  "user_interface::findFile()", referenced from:
      loadNewCollection()     in mainlogic.o
  "user_interface::displayMainMenu(std::vector<vocabCollection, std::allocator<vocabCollection> >)", referenced from:
      mainlogic()    in mainlogic.o
  "user_interface::getUserAction()", referenced from:
      mainlogic()    in mainlogic.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [cheapassVocab.app/Contents/MacOS/cheapassVocab] Error 1
The process "/usr/bin/make" exited with code 2.
Error while building project cheapassVocab (target: Desktop)
When executing build step 'Make'

Что здесь происходит?

Ответы [ 3 ]

4 голосов
/ 17 августа 2011

В заголовочном файле вы объявляете функцию findFile в пространстве имен user_interface.В файле cpp определена функция free findFile.Да, вы using namespace user_interface, но компилятор не знает, что findFile, определенный там, принадлежит namespace user_interface.Результатом всего этого является то, что вы объявили user_interface::findFile и определили ::findFile.Когда вы вызываете user_interface::findFile, компоновщик не может его найти, поскольку есть только бесплатная функция findFile.

Легко решается - файл cpp:

#include "userinterface.h"
using namespace std;

namespace user_interface
{
    string findFile()
    {
        return "./";
    }
}
2 голосов
/ 17 августа 2011

Вы не можете реализовать findFile таким образом;он действительно должен идти в пространстве имен:

namespace user_interface
{
    string findFile()
    {
        return "./";
    }
}

or:

string user_interface::findFile()
{
    return "./";
}

Директива using предназначена только для поиска, а не для определений - представьте себе, что using namespace std; сделает со всеми вашими определениями функций в противном случае!

1 голос
/ 17 августа 2011

Вы определяете findFile в неправильном пространстве имен.

Либо

std::string user_interface::findFile()
{
    return "./";
}

или

namespace user_interface
{
    std::string findFile()
    {
        return "./";
    }
}

using не влияет на то, где определены имена, оновлияет только на поиск имен.

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