这可能是一些愚蠢的语法错误,我在h文件中编写了以下类
#include "IGenticSolverHelper.h"
template <class T>
class GenericGeneticSolver
{
public:
GenericGeneticSolver(IGenticSolverHelper<T>& helper, int generationSize) : mSolverHelper(helper)
{
mSolverHelper.GenerateFirstGeneration(0, generationSize, currentGeneration);
}
private :
vector<T> currentGeneration;
IGenticSolverHelper<T>& mSolverHelper;
};
然后是以下代码:
#include "IGenticSolverHelper.h"
#include "GenericGeneticSolver.h"
class HelperImpl : IGenticSolverHelper<int>
{
public:
void GenerateFirstGeneration(const int seed,const int generationSize, vector<int>& firstGeneration)
{
}
void Crossover(const int& father,const int& mother, int& son)
{
}
void Mutate(const int& orignal, int& mutated)
{
}
float Cost(int& solution)
{
}
};
int main()
{
int a =5;
GenericGeneticSolver<int> mySolver(HelperImpl,a);
}
而且我编译时收到以下错误:
error C2061: syntax error : identifier 'a'
如果我将线更改为:
GenericGeneticSolver<int> mySolver(HelperImpl);
它会编译,尽管构造函数需要2个参数,并且会收到以下警告:
warning C4930: 'GenericGeneticSolver<T> mySolver(HelperImpl)': prototyped function not called (was a variable definition intended?)
更奇怪的是,当我在这条线上设置断点时,他不会停在那里。
我在做什么错,我只是尝试创建
GenericGeneticSolver
的实例 最佳答案
看一下这一行:
GenericGeneticSolver<int> mySolver(HelperImpl,a);
编译器对您要在此处执行的操作感到困惑,因为
HelperImpl
是类型的名称,而a
是对象的名称。编译器认为您正在做的事情是尝试创建一个名为mySolver
的函数的原型(prototype),该函数需要一个HelperImpl
类型的参数和一个a
类型的参数,但由于不知道任何类型的a
而陷入困境。如果删除
a
,则会得到以下信息:GenericGeneticSolver<int> mySolver(HelperImpl);
这是一个名为
mySolver
的函数的完全合法的原型(prototype),该函数接受HelperImpl
类型的参数并返回GenericGeneticSolver<int>
。您得到的警告是编译器告诉您,您可能无意将其制作为原型(prototype),因为它看起来像是一个名为mySolver
的变量的实例化,但不是。因为我假设您要在此处实例化
GenericGeneticSolver<int>
类型的对象,所以您可能要实例化HelperImpl
并将该对象传递给构造函数,如下所示:HelperImpl hi;
GenericGeneticSolver<int> mySolver(hi, a);
希望这可以帮助!
关于c++ - 使用模板的C++语法帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20914934/