2013-12-06 4 views
0

Я использую Xcode и получать следующие сообщения об ошибке при компиляции:неопределенные символы для архитектуры x86_64: Построение стека

Undefined symbols for architecture x86_64: 
"fsu::Stack<char, 10ul>::Pop()", referenced from: 
    _main in main.o 
"fsu::Stack<char, 10ul>::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>  >&)", referenced from: 
    _main in main.o 
"fsu::Stack<char, 10ul>::Push(char const&)", referenced from: 
    _main in main.o 
"fsu::Stack<char, 10ul>::Stack(char)", referenced from: 
    _main in main.o 
"fsu::Stack<char, 10ul>::~Stack()", referenced from: 
    _main in main.o 
"fsu::Stack<char, 10ul>::Display(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char) const", referenced from: 
    _main in main.o 
ld: symbol(s) not found for architecture x86_64 

Мой тестовый клиент выглядит следующим образом:

#include <iostream> 
#include "stack.h" 

int main() 
{ 
    typedef char ElementType; 
    ElementType fill = '*'; 
    const size_t maxSize = 10; 
    typedef fsu::Stack < ElementType , maxSize > StackType; 
    StackType s(fill); 

    s.Push('a'); 
    s.Push('b'); 
    s.Pop(); 

    s.Display(std::cout, '\0'); 
    s.Dump(std::cout); 

    return 0; 
} // end main 

Мой заголовочный файл :

#include <iostream> 

namespace fsu 
{ 
    template < typename T, size_t N = 100> 
    class Stack 
    { 
    public: 
    // Stack < T , N > API 
    void  Push  (const T& t); // push t onto stack; error if full 
    T  Pop  ();   // pop stack and return removed element; error 
            //if stack is empty 
    T&  Top  ();   // return top element of stack; error if empty 
    const T& Top  () const;  // const version 
    size_t Size () const;  // return number of elements in stack 
    size_t Capacity() const;  // return storage capacity [maximum size] of 
            // stack 
    bool  Empty () const;  // return 1/true if stack is empty, 0/false if 
            //not empty 
    void  Clear ();   // make the stack empty 
    void  Display (std::ostream& os, char ofc = '\0') const; // output stack 
            // contents through os, top to bottom 
    void  Dump  (std::ostream& os); // output all private data (for dev only) 
    Stack   ();   // default constructor 
    Stack    (T fill);  // puts "fill" in each slot of the underlying 
            // array (keeps size = 0) 
    Stack    (const Stack&); // copy constructor 
    ~Stack   ();    // destructor 
    Stack& operator = (const Stack&); // assignment operator 

    private: 
    const size_t capacity_; // = N = size of array - fixed during life of stack 
    T   data_[N]; // array of T objects - where T objects are stored 
    size_t  size_;  // current size of stack - dynamic during life of stack 
    }; 
} 

И я включу только мою реализацию для конструкторов и деструкторов здесь для е ради краткости:

#include "stack.h" 
#include <iostream> 

// Stack < T , N > API 

template < typename T , size_t N > 
fsu::Stack<T,N>::Stack() : capacity_(N), data_(), size_(0) 
{} 

template < typename T , size_t N > 
fsu::Stack<T,N>::Stack (T fill) : capacity_(N), size_(0)  // puts "fill" in each slot  of the underlying array (keeps size = 0) 
{ 
    for(size_t i = 0; i < capacity_; ++i) 
    data_[i] = fill; 
} 

template < typename T , size_t N > 
fsu::Stack<T,N>::~Stack()    // empty destructor 
{ 
    //nothing here 
} 

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

ответ

1

Возможно, вам необходимо явно создать ваш шаблонный класс. Вы можете сделать это, добавив следующую строку в файл с реализацией:

template class fsu::Stack<char, 10>; 

Это заставит компилятор инстанцирует эту версию шаблона класса.

Подробнее о синтаксисе здесь: http://en.cppreference.com/w/cpp/language/class_template
(. Прокрутите вниз до Явного Инстанцирования)

+0

Просто попробовал это, и я до сих пор сталкиваюсь с теми же ошибками, к сожалению. – RandomPleb

+0

@RandomPleb: У вас есть реализации дампа, толчка, поп и дисплей? Кроме того, я не уверен, что это важно, но исторически я поместил свои явные экземпляры после полной реализации (т. Е. В сторону нижней части файла). Не уверен, что это действительно необходимо. –

+0

Это работает! Я чувствую, что мы не должны делать это таким образом, но по крайней мере я могу проверить свой код сейчас. Я все еще удивляюсь, что я делаю неправильно ... (И да, у меня есть эти реализации.) – RandomPleb

Смежные вопросы