无法将函数定义与具有类模板的现有声明匹配

时间:2013-01-25 18:53:08

标签: c++ templates

我创建了一个模板类,它应该将网格存储为二维std::vector;然而,当我编译时,使用VC ++(2010如果重要但我怀疑它)我得到以下错误:

  

无法将函数定义与现有声明匹配

尽管它试图匹配的两个函数完全相同。

以下是头文件中的代码:

#pragma once
#include "CBlock.h"

template<class T>
class CMyGrid{

public:
    long sizeX;
    long sizeY;
    /*block position on grid*/
    std::vector<std::vector<T*>> System;

    CMyGrid();
    ~CMyGrid();
    CMyGrid(int sizeXp, int sizeYp){sizeX = sizeXp; sizeY =sizeYp;};

    void Set(T *data, int x, int y){System.at(x).at(y) = data;};
    int GetSizeX(){return sizeX;}
    int GetSizeY(){return sizeY;}

    int getxPosition(T *data); /*make easier put in struct*/
    int getyPosition(T *data);
    /*size*/ /* will hopefully be sizex by sizey*/
};

这是cpp文件:

#include "stdafx.h"
#include "CMyGrid.h"
#include "CBlock.h"
template <class T>


template <class T>
int CMyGrid<T>::getxPosition(T *data)
{
    for (int i = 0; i <System.size(); i++)
    {
        for (int j = 0; j < System[i].size(); j++)
        {
            if data == System[i][j];
                return j;
            else 
                continue;
        }
    }
}

template <class T>
int CMyGrid<T>::getyPosition(T *data)
{
    for (int i = 0; i <System.size(); i++)
    {
        for (int j = 0; j < System[i].size(); j++)
        {
            if data == System[i][j];
                return i;
            else 
                continue;
        }
    }
}

以下是整个错误:

  

1&gt; c:\ users \ chris \ documents \ visual studio 2010 \ projects \ testtest \ testtest \ cmygrid.cpp(33):错误C2244:'CMyGrid :: getxPosition':无法将函数定义与现有声明匹配
  1 GT; c:\ users \ chris \ documents \ visual studio 2010 \ projects \ testtest \ testtest \ cmygrid.h(18):查看'CMyGrid :: getxPosition'的声明

          1 GT;定义
          1 GT; 'int CMyGrid :: getxPosition(T *)'
          1 GT;现有声明
          1 GT; 'int CMyGrid :: getxPosition(T *)'

我已经阅读了其他几个有类似问题的线程,并且已经将错误更改为链接器错误,如果我在头文件中包含两个getposition函数的函数代码并且声明旁边的错误。链接器错误是:

  

1&gt; CBoard.obj:错误LNK2019:未解析的外部符号“public:__thiscall CMyGrid :: CMyGrid(void)”(?? 0?$ CMyGrid @ VCBlock @@@@ QAE @ XZ)在函数“public”中引用: __thiscall CBoard :: CBoard(void)“(?? 0CBoard @@ QAE @ XZ)
  1&gt; CBoard.obj:错误LNK2019:未解析的外部符号“public:__thiscall CMyGrid :: ~CMyGrid(void)”(?? 1?$ CMyGrid @ VCBlock @@@@ QAE @XZ)在函数“public:__thiscall CBoard”中引用::〜CBoard(无效)“(?? 1CBoard @@ QAE @ XZ

1 个答案:

答案 0 :(得分:0)

问题是您无法在.cpp中实施模板。 尝试将您的代码更改为.h

这里有一篇很重要的文章解释了这一点。

Storing C++ template function definitions in a .CPP file