繁体   English   中英

使用C ++的Apple mach-o链接器(id)错误

[英]Apple mach-o linker (id) error with C++

我在Xcode 5.0中创建了一个新项目来实现Queue类,如下所示:我创建了一个名为QueueArray.h的.h文件,它包含以下内容:

#ifndef __Queue__QueueArray__
#define __Queue__QueueArray__

#include <iostream>

template <class T>
class QueueArray
{
public:
    QueueArray(int cap);
    ~QueueArray();

    void Enqueue(T& val);
    T Dequeue(void);
    T GetFirst(void);
    T GetLast(void);
    bool IsEmpty(void);
    bool IsFull(void);
    void Clear(void);

private:
    T* data;
    int capacity, size, first, last;
};

#endif

和一个名为QueueArray.cpp的.cpp文件,其中包含以下内容:

#include "QueueArray.h"
using namespace std;

template <class T>
QueueArray<T>::QueueArray(int cap)
{
    capacity = cap;
    data = new T[capacity];
    size = 0;
    first = last = -1;
}

template <class T>
QueueArray<T>::~QueueArray(void)
{
    delete [] data;
}

template <class T>
void QueueArray<T>::Enqueue(T& el)
{
    if(IsFull() == true)
    {
        printf("\n Can't enqueue into a full queue!");
        return;
    }
    if(IsEmpty() == true)
        first = last = 0;
    else if(last == capacity-1)//if at the last entry
        last = 0; //wrap around to the first entry
    else
        last++;
    data[last] = el;
    size++;
}

template <class T>
T QueueArray<T>::Dequeue()
{
    if(IsEmpty() == true)
    {
        printf("\n Can't dequeue from an empty queue!");
        return -1;
    }
    T el = data[first];
    if(first == last) //if only one element in queue
        last = first = -1; //we'll get an empty queue
    else if(first == capacity-1) //if at the last entry
        first = 0; //wrap around to the first entry
    else //normal case
        first++;
    size--;
    return el;
}

template <class T>
T QueueArray<T>::GetFirst()
{
    return data[first];
}

template <class T>
T QueueArray<T>::GetLast()
{
    return data[last];
}

template <class T>
bool QueueArray<T>::IsEmpty(void)
{
    return size == 0;
}

template <class T>
bool QueueArray<T>::IsFull(void)
{
    return size == capacity;
}

和一个main.cpp文件,其中包含以下内容:

#include <iostream>
#include "QueueArray.h"
using namespace std;

int main(int argc, const char * argv[])
{
    QueueArray<int> q(100);
    for (int i=0; i<100; i++)
    {
        q.Enqueue(i);
    }
    for (int i=0; i<100; i++) {
        cout<<q.Dequeue()<<endl;
    }
    return 0;
}

当我尝试运行该项目时,会显示一条消息“Build Failed”,这是错误的屏幕截图:

截图

如何解决?

编译器在使用之前需要查看模板的定义。

http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html

有多个解决方案:

一种。 将定义从.cpp文件移动到.h文件

如果您的编译器支持,请使用export关键字

http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl-export-keyword.html

C。 添加内联声明:

http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html

您需要将模板定义与其声明一起包含在内。 一个简单的解决办法是重命名QueueArray.cpp喜欢的东西QueueArray_impl.h#include从底部它QueueArray.h

#ifndef __Queue__QueueArray__
#define __Queue__QueueArray__

#include <iostream>

template <class T>
class QueueArray
{
public:
    QueueArray(int cap);
    ~QueueArray();

    void Enqueue(T& val);
    T Dequeue(void);
    T GetFirst(void);
    T GetLast(void);
    bool IsEmpty(void);
    bool IsFull(void);
    void Clear(void);

private:
    T* data;
    int capacity, size, first, last;
};

#include "QueueArray_impl.h"

#endif

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM