グリッドを 2 次元として格納するテンプレート クラスを作成しましたstd::vector
。ただし、VC ++を使用してコンパイルすると(問題がある場合は2010ですが、疑わしい)、次のエラーが発生します。
関数定義を既存の宣言と一致させることができません
一致させようとしている 2 つの関数はまったく同じですが。
ヘッダー ファイルのコードは次のとおりです。
#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 *)'
同様の問題を抱えた他のスレッドをいくつか読んだことがありますが、エラーをリンカ エラーに変更するところまで行きました。これは、2 つの 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: __thiscallyGrid::~CMyGrid(void)" (??1?$CMyGrid@VCBlock @@@@QAE@XZ) 関数 "public: __thiscall CBoard::~CBoard(void)" で参照 (??1CBoard@@QAE@XZ