正如标题所述,我遇到了臭名昭著的unresolved external symbol
链接器问题。
我已经移动了.h
文件中的所有内容。模板类不再在.h
和.cpp
文件之间划分。
我已将它们包含在主文件中。我已经三重四倍检查了定义(显然)。
我的文件如下:
Utils.h
:
vector
和valarray
只是一个漂亮的例子。经过测试并可以正常工作。
#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
文件之外)以外的解决方案,但均未成功。