这可能是一些愚蠢的语法错误,我在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/

10-11 15:34