这可能是一些愚蠢的语法错误,我有以下用h file
编写的类#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
答案 0 :(得分:3)
看看这一行:
GenericGeneticSolver<int> mySolver(HelperImpl,a);
编译器对您在此处尝试执行的操作感到困惑,因为HelperImpl
是类型的名称,而a
是对象的名称。编译器认为你正在做的是尝试原型化一个名为mySolver
的函数,该函数接受类型为HelperImpl
的参数和类型为a
的参数,但随后因为它没有被卡住不知道名为a
的任何类型。
如果您删除a
,则会收到:
GenericGeneticSolver<int> mySolver(HelperImpl);
这是一个名为mySolver
的函数的完全合法的原型,它接受HelperImpl
类型的参数并返回GenericGeneticSolver<int>
。您收到的警告是编译器告诉您可能没有打算将其作为原型,因为它看起来像是名为mySolver
的变量的实例化,但不是。
因为我假设你试图在这里实例化一个GenericGeneticSolver<int>
类型的对象,你可能想要实例化一个HelperImpl
然后将该对象传递给构造函数,如下所示:
HelperImpl hi;
GenericGeneticSolver<int> mySolver(hi, a);
希望这有帮助!