【问题标题】:unable to match function definition to an existing declaration with class template无法将函数定义与具有类模板的现有声明匹配
【发布时间】:2013-01-25 18:53:07
【问题描述】:

我创建了一个模板类,它应该将网格存储为二维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>c:\users\chris\documents\visual studio 2010\projects\testtest\testtest\cmygrid.cpp(33): 错误 C2244: 'CMyGrid::getxPosition' : 无法将函数定义与现有声明匹配
1> c:\users\chris\documents\visual studio 2010\projects\testtest\testtest\cmygrid.h(18) :参见“CMyGrid::getxPosition”的声明
1> 定义
1> 'int CMyGrid::getxPosition(T *)'
1> 现有声明
1> 'int CMyGrid::getxPosition(T *)'

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

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

【问题讨论】:

  • template&lt;class T&gt; 在 .CPP 文件中包含后在做什么?
  • 哦,那个,一个代码太多,又把错误改成链接了^^
  • 所以,它领先一步!您遇到什么链接错误?
  • 如何在注释中添加代码... n1>CBoard.obj : 错误 LNK2019: 无法解析的外部符号 "public: __thiscall CMyGrid::CMyGrid(void) " (??0?$CMyGrid@VCBlock@@@@QAE@XZ) 在函数 "public: __thiscall CBoard::CBoard(void)" (??0CBoard@@QAE@XZ) 1>CBoard.obj 中引用:错误LNK2019:未解析的外部符号“public: __thiscall CMyGrid::~CMyGrid(void)”(??1?$CMyGrid@VCBlock@@@@QAE@XZ) 在函数“public: __thiscall”中引用CBoard::~CBoard(void)" (??1CBoard@@QAE@XZ)

标签: c++ templates


【解决方案1】:

问题是您不能在.cpp 中实现模板。 尝试将您的代码更改为.h

这里有一篇大文章解释了这一点。

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

【讨论】:

  • 只要声明模板的参数,就可以在 CPP 中实现。
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多