Я использую 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
}
Я понимаю, что хорошая часть моего кода все еще требует работы, но это ошибка, которая мешает мне испытывать мой код на всех. Я потерял то, что вызывает эту ошибку, и потратил на это немало времени. Проблема, похоже, влияет на любой метод, который я вызываю из моей реализации. Какие-нибудь идеи относительно проблемы?
Просто попробовал это, и я до сих пор сталкиваюсь с теми же ошибками, к сожалению. – RandomPleb
@RandomPleb: У вас есть реализации дампа, толчка, поп и дисплей? Кроме того, я не уверен, что это важно, но исторически я поместил свои явные экземпляры после полной реализации (т. Е. В сторону нижней части файла). Не уверен, что это действительно необходимо. –
Это работает! Я чувствую, что мы не должны делать это таким образом, но по крайней мере я могу проверить свой код сейчас. Я все еще удивляюсь, что я делаю неправильно ... (И да, у меня есть эти реализации.) – RandomPleb