C ++语法帮助,使用模板

时间:2014-01-03 23:58:47

标签: c++ templates

这可能是一些愚蠢的语法错误,我有以下用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

的实例

1 个答案:

答案 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);

希望这有帮助!