未解析的外部令牌与模板类

时间:2017-03-27 19:16:58

标签: c++

已解决:我是个白痴,并在头文件的底部包含头文件,而不是实现文件。

这个项目适用于我的C ++课程中的任务,所以我们非常感谢任何指导。我知道模板类会导致编译器出现问题,所以你必须做一些特殊的事情才能让它们读出来。我的教授为我们提供了修复'这个。我跟踪了所有这些,但我仍然得到一堆未解决的令牌错误。

我得到的错误:

LNK2028,LNK2019,LNK1120(每个的倍数)

标题文件:

#include <iostream>
namespace cs_pairs
{
template <class T>
class orderedPair
{
public:
    static const int DEFAULT_VALUE;

    typedef std::size_t size_type;
    typedef T value_type;

    orderedPair(value_type newFirst = DEFAULT_VALUE, value_type newSecond = DEFAULT_VALUE);
    void setFirst(value_type newFirst);
    void setSecond(value_type newSecond);
    value_type getFirst();
    value_type getSecond();
    orderedPair operator+(const orderedPair& right);
    bool operator<(const orderedPair& right);
    void print();

    class DuplicateMemberError {};
private:
    value_type first;
    value_type second;
};

template <class T>
const int orderedPair<T>::DEFAULT_VALUE = int();

#include "orderedPair.h"
}

实施档案:

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

namespace cs_pairs
{
template <class T>
orderedPair<T>::orderedPair(value_type newFirst = DEFAULT_VALUE, value_type newSecond = DEFAULT_VALUE)
{
    setFirst(newFirst);
    setSecond(newSecond);
}

template <class T>
void orderedPair<T>::setFirst(value_type newFirst)
{
     if statement to throw an exception if precondition not met goes here.   
    if (first == second)
    {
        throw DuplicateMemberError e;
    }
    first = newFirst;
}

template <class T>
void orderedPair<T>::setSecond(value_type newSecond)
{
     if statement to throw an exception if precondition not met goes here.    
    if (first == second)
    {
        throw DuplicateMemberError e;
    }
    second = newSecond;
}

template <class T>
typename orderedPair<T>::value_type orderedPair<T>::getFirst()
{
    return first;
}

template <class T>
typename orderedPair<T>::value_type orderedPair<T>::getSecond()
{
    return second;
}

template <class T>
orderedPair<T> orderedPair<T>::operator+(const orderedPair<T>& right)
{
    return orderedPair(first + right.first, second + right.second);
}


template <class T>
bool orderedPair<T>::operator<(const orderedPair<T>& right)
{
    return first + second < right.first + right.second;
}


template <class T>
void orderedPair<T>::print()
{
    cout << "(" << first << ", " << second << ")";
}
}

1 个答案:

答案 0 :(得分:0)

删除&#39; #include orderedPair.h&#39;从你的标题。您不希望任何头文件包含在内。

您可能已经包含了lan实现文件,在这种情况下,它是正确的。