2012-01-29 23 views
0

可能重複:
「Undefined reference to」 template class constructor在子類中調用基類的模板函數是否合法?

我剛開始使用模板,我是隨便它實際上是否是合法的調用模板函數的子類。我的問題是在下面的代碼中的模板函數ChangeSprite。它被稱爲子類,但這會產生鏈接錯誤。如果我刪除了模板部分,並且只給它一個我計劃使用它的多種事情之一,它可以正常工作,所以我擔心我無法做到這一點。

//base class 
#pragma once 
#include "Tile.h" 
#include <list> 
#include "Sprite.h" 
#include "WindowCreater.h" 
#include "Directx.h" 
#define LeftClickParameters WindowCreator *gw, Mouse* mouse 
struct Grid 
{ 

    SPRITE *sprite; 
    int width, hieght; 
    int w, h; 
    int x, y; 
    Grid(int width, int hieght,SPRITE *sprites); 
    list<Tile> tilew; 
    list<list<Tile>> tileh; 

    //methods 

    void savefile(); 
    void openfile(); 
    virtual void MoveLeft() = 0; 
    virtual void MoveRight() = 0; 
    virtual void MoveUp() = 0; 
    virtual void MoveDown() = 0; 
    virtual void addrow() = 0; 
    virtual void deleterow() = 0; 
    virtual void addcolumb() = 0; 
    virtual void deletecolumb() = 0; 

    //template functions 
    template <class T> void ChangeSprite(SPRITE *newSprite,list<T> tilew,list<list<T>> tileh); 

    // Virtual methods 
    virtual list<Tile> ReadTiles() = 0; 
};  

而這正是它被稱爲

//how the function is being called 
void Map::Brush(SPRITE *newSprite, POINT MousePosition) 
{ 
    Grid::ChangeSprite<MapTile>(newSprite,mapTilew,mapTileh); 
} 
+0

該函數的定義在哪裏? – 2012-01-29 23:27:26

+0

爲什麼您的ChangeSprite函數首先需要成爲模板? – 2012-01-29 23:37:16

回答

1

可以從Grid否則只要Map繼承,你將不得不作出ChangeSprite靜態的,或者給它一個Map對象採取行動。這裏有一個孩子調用父母模板函數的有效例子。

struct Grid { 
    template <class T> void ChangeSprite(/*params here*/) { 
    // code here 
    } 
}; 

struct Map : public Grid { 
    void Brush() { 
     // bool being a placeholder for MapTile 
     Grid::ChangeSprite<bool>(/*params here*/) { 
      // code here 
     } 
    } 
}; 

你的問題很可能在於你使用的不同的文件,例如模板的功能應該在頭文件中定義,或者低於你的類定義。

相關問題