简体   繁体   中英

Undefined reference to 'PreconditionViolatedException::PreconditionViolatedException(std::string const&)'

I'm having a terrible time finding the issue with a code project, which consists of four files:

GiftRegistry.cpp:

#include "GiftRegistry.h"
#include "LinkList/LinkedList.h"
#include "LinkList/LinkedList.cpp"
#include <iostream>

template<class ItemType>
GiftRegistry<ItemType>::GiftRegistry() : giftRegistry(new LinkedList<ItemType>())
{
}

template<class ItemType>
bool GiftRegistry<ItemType>::addGift(const ItemType& gift, int desiredRank)
{
    if(giftRegistry->insert(desiredRank, gift))
    {
        return true;
    }
    else{
        return false;
    }
}

template<class ItemType>
void GiftRegistry<ItemType>::moveGift(int curPos, int newPos)
{
    if(giftRegistry->isEmpty())
    {
        ItemType itemToMove = giftRegistry->getEntry(curPos);

        if(giftRegistry->insert(newPos, itemToMove))
        {
            cout << "Gift moved successfully!";
        }
        if(giftRegistry->remove(curPos))
        {
            cout << "Gift removed successfully";
        }
        else{
            cout << "Operation failed. Please examine input.";
        }
    }
}

template<class ItemType>
bool GiftRegistry<ItemType>::removeGift(int position)
{
    if(giftRegistry->isEmpty())
    {
        if(giftRegistry->remove(position))
        {
            return true;
        }

    }
    else
    {
        return false;
    }
}

template<class ItemType>
void GiftRegistry<ItemType>::showRegistry()
{
    for(int i = 1; i < giftRegistry->getLength(); i++)
    {
        ItemType itemToPrint = giftRegistry->getEntry(i);
        std::cout << i + "." + itemToPrint;
    }
}

main.cpp:

#include "GiftRegistry.cpp"
//#include "LinkList/LinkedList.cpp"
#include <iostream>
#include <string>

using namespace std;

int main()
{
    ListInterface<string>* listPtr = new LinkedList<string>();
    //RegistryInterface<string>* weddingRegistry = new GiftRegistry<string>();
    string gift = "hello there";
    listPtr->insert(1, gift);
    cout << listPtr->getEntry(1);
//    string gift = "Box of rocks";
//
//    RegistryInterface<string>* weddingRegistry = new GiftRegistry<string>();
//    if(weddingRegistry->addGift(gift, 1))
//    {
//        cout << "Added item " + gift;
//        weddingRegistry->showRegistry();
//    }
//    else
//    {
//        cout << "Failed to add item. Error.";
//    }
    //weddingRegistry->showRegistry();

    return 0;
}

GiftRegistry.h:

#ifndef Gift_Registry_
#define Gift_Registry_

#include "RegistryInterface.h"
#include "C:\Users\Austin\Documents\LinkList\LinkedList.h"
using namespace std;

template<class ItemType>
class GiftRegistry : public RegistryInterface<ItemType>
{
private:
    LinkedList<ItemType>* giftRegistry;

public:
    string CustomerName;
    string EventName;
    GiftRegistry();

    bool addGift(const ItemType& gift, int desiredRank);
    void moveGift(int curPos, int newPos);
    bool removeGift(int position);
    void showRegistry();

    virtual ~GiftRegistry();
};

#endif // _GiftRegistry_

RegistryInterface.h:

#ifndef REGISTRY_INTERFACE_
#define REGISTRY_INTERFACE_

template<class ItemType>
class RegistryInterface
{
public:
    /** Adds gift to the gift registry
    @post Add was successful
    @param gift The gift to be added to the registry.
    @param giftRank The rank to be attributed to the gift. Also determines the point of insertion for the gift.
    @return 'True' if addition was successful, 'false' if item already exists in the list
    **/
    virtual bool addGift(const ItemType& gift, int giftRank) = 0;

    /** Moves the gift to the user-desired location / priority
    @pre List is not empty
    @param currentPosition The current position of the gift to be moved.
    @param desiredPosition The new position
    **/
    virtual void moveGift(int currentPosition, int desiredPosition) = 0;

    /** Removes the specified item from the List
    @pre List is not empty
    @post Item was removed
    @param position The index of the item to be removed
    @return 'True' if gift was removed, 'False' if not
    **/
    virtual bool removeGift(int position) = 0;


    /** Prints the registry contents and displays them by most wanted to least wanted
    @pre List is not empty
    **/
    virtual void showRegistry() = 0;

    /** Destroys this registry and frees its assigned memory.
    **/
    virtual ~RegistryInterface() { }
};
#endif // REGISTRY_INTERFACE_

I am using Code::Blocks 16.01 and adhering to C++11 standards. The problem arises when running the 'main.cpp' file, which causes the following error to appear:

||=== Build: Debug in GiftList (compiler: GNU GCC Compiler) ===| obj\\Debug\\main.o||In function ZNK10LinkedListISsE8getEntryEi':| C:\\Users\\Arralan\\Documents\\LinkList\\LinkedList.cpp|121|undefined reference to ZNK10LinkedListISsE8getEntryEi':| C:\\Users\\Arralan\\Documents\\LinkList\\LinkedList.cpp|121|undefined reference to PreconditionViolatedException::PreconditionViolatedException(std::string const&)'| obj\\Debug\\main.o||In function ZN10LinkedListISsE7replaceEiRKSs':| C:\\Users\\Arralan\\Documents\\LinkList\\LinkedList.cpp|140|undefined reference to ZN10LinkedListISsE7replaceEiRKSs':| C:\\Users\\Arralan\\Documents\\LinkList\\LinkedList.cpp|140|undefined reference to PreconditionViolatedException::PreconditionViolatedException(std::string const&)'| ||error: ld returned 1 exit status| ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

I'm new-ish to Data Structures, and this issue has had me hung up for two days now. Any help or guidance would be appreciated, though please keep in mind that this is a homework assignment.

The code in "LinkList" is error-free and runs as intended in its separate project, but behaves strangely when being reference from another project. I believe the issue may be with my '#include' statements.

EDIT: The issue was caused by an '#include' that was necessary in this unique instance. The solution I've found, whether the best or not, is to add this path via '#include': "LinkList/PreconditionViolatedException.cpp". After adding this line to my 'main.cpp', the error has stopped appearing.

The issue was caused by an '#include' that was necessary in this unique instance. The solution I've found, whether the best or not, is to add this path via '#include': "LinkList/PreconditionViolatedException.cpp". After adding this line to my 'main.cpp', the error has stopped appearing.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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