类模板上一个特定功能的未解析外部符号

正如标题所述,我遇到了臭名昭著的unresolved external symbol链接器问题。

我已经移动了.h文件中的所有内容。模板类不再在.h.cpp文件之间划分。

我已将它们包含在主文件中。我已经三重四倍检查了定义(显然)。

我的文件如下:

Utils.h

vectorvalarray只是一个漂亮的例子。经过测试并可以正常工作。

#pragma once

#include <vector>
#include <valarray>
#include <ostream>

using std::vector;
using std::valarray;
using std::ostream;


template <typename ValueType>
ostream& operator<< (ostream&,vector<ValueType>);

template <typename ValueType>
ostream& operator<< (ostream&,valarray<ValueType>);


template <typename ValueType>
ostream& operator<< (ostream& out,vector<ValueType> v)
{
    out << "Vec[";
    for (int i = 0; i < v.size() - 1; i++)
        out << v[i] << ",";
    out << v[v.size() - 1] << "]";
    return out;
}


template <typename ValueType>
ostream& operator<< (ostream& out,valarray<ValueType> a)
{
    out << "VArr[";
    for (int i = 0; i < a.size() - 1; i++)
        out << a[i] << ",";
    out << a[a.size() - 1] << "]";
    return out;
}

fitness.h: 一个简单的类,包含几个valarray和一个bool。也实现一个漂亮的提示。经过测试并可以正常工作。

#pragma once

#include <valarray>
#include <ostream>

#include "Utils.h"

using std::valarray;
using std::ostream;


class fitness {

public:
    class fitnessNotValidException : public std::exception {};
    class ValueIndexTooLargeException : public std::exception {};
    class IncorrectNewValuesLength : public std::exception {};

private:
    const valarray<double> weights;
    bool valid;
    valarray<double> values;

public:

    fitness(const valarray<double>&);
    static fitness max();
    static fitness min();

    double Weightedfitness();

    const valarray<double>& Weights();

    bool Valid();
    void Valid(bool);

    void invalidate();
    void validate();

    const valarray<double>& Values();
    void Values(int,double);
    void Values(const valarray<double>&);

    double Value();
    void Value(double);

    friend ostream& operator<< (ostream&,fitness);
};

// Implementation for everything...

ostream& operator<<(ostream & out,fitness fit)
{
    out << "fitness[W:" << fit.weights << ",V:" << fit.values << ",valid:" << fit.valid << "]";
    return out;
}

Individual.h: 具有fitness成员的模板类。还实现了“ pretty-cout”。

#pragma once

#include <ostream>
#include <valarray>

#include "fitness.h"

using std::ostream;


template <typename GeneType>
class Individual
{
private:
    fitness fitness;
    GeneType genes;

public:

    Individual(fitness,GeneType);

    fitness& fitness();

    GeneType& Genes();

    Individual<GeneType> copy();

    friend ostream& operator<< (ostream&,Individual<GeneType>);
};

// Implementation for everything...

template<typename GeneType>
ostream& operator<<(ostream& out,Individual<GeneType> ind)
{
    out << "Individual[G:" << ind.genes << ",F:" << ind.fitness << "]";
    return out;
}

所有这3个文件都以相同的顺序包含在主文件中。如果我尝试打印一个人的基因和健康状况,那么一切都很好:

Individual<valarray<int>> ind = ind_builder.build();

cout << ind.fitness() << endl << ind.Genes() << endl;

/*
fitness[W:VArr[1],V:VArr[0],valid:0]
VArr[0,1,1]
*/

表示<<的{​​{1}},valarray的工作原理,因此我对fitness的工作原理没有任何误解。但是当我尝试:<<

  

错误LNK2019:未解决的外部符号“类   std :: basic_ostream>&__cdecl   运算符      

    

&,class个人>)”(?? 6 @ YAAEAV?$ basic_ostream @ DU?$ char_traits @ D @ std @@@ std @@ AEAV01 @ V?$ Individual @ V?$ valarray @ H @ std @ @@@@ Z)     在函数main中引用

  

我看不出问题出在哪里。包含项似乎是有序的,在cout << ind << endl;.h之间没有分裂问题。我应该知道另一个模板陷阱吗?因为我一直在寻找除建议的解决方案(例如将所有代码移至.cpp文件之外)以外的解决方案,但均未成功。

tcl1011 回答:类模板上一个特定功能的未解析外部符号

operator <<定义与operator <<朋友声明不匹配,请注意,定义的operator <<实际上是模板,因此比未实现的非模板朋友更受青睐。因此,由于编译器插入了非模板未实现的好友函数的调用,因此出现链接器错误。此外,operator <<应该通过const限定引用作为对象。

您应避免使用friend,但如果仍要使用它,则声明应为

template <typename GeneType>
class Individual;

template<typename GeneType>
ostream & operator <<(ostream &,Individual<GeneType> const & individual);

template <typename GeneType>
class Individual
{
   template<typename GeneTypeInner>
   friend ostream & operator <<(ostream &,Individual<GeneTypeInner> const & individual);
};

template<typename GeneType>
ostream & operator<<(ostream& out,Individual<GeneType> const & individual)
{
    out << "Individual[G:" << individual.genes << ",F:" << individual.fitness << "]";
    return out;
}
本文链接:https://www.f2er.com/3116841.html

大家都在问