unresolved external symbol

I am having a hard time calling a method from a superclass. I have two classes, levelBase and levelOne, where levelOne inherits from levelBase. I am trying to call the getTile method from levelBase, but it is giving me the following error.

levelOne.obj : error LNK2001: unresolved external symbol "public: static class sf::Sprite __cdecl levelBase::getTile(enum levelBase::Tile)" (?getTile@levelBase@@SA?AVSprite@sf@@W4Tile@1@@Z)

Here are my files:

levelBase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef __Game__levelBase__
#define __Game__levelBase__

#include <vector> 
#include "SFML/Graphics.hpp"
#include "SFML/Window.hpp" 

class levelBase
{
public:
	levelBase(void);
	~levelBase(void);
	
	//Row 2, Columns 6 - 11
	static enum Tile {GrassLeft, Grass1, Grass2, Grass3, Grass4, GrassRight,Dirt};

	static sf::Sprite getTile(Tile tile);

  
};

#endif 


levelBase.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "levelBase.h"


/*
Base class for a level Object. 

Loads the texture file and returns the sprites. 

/**/ 



sf::Texture texture; 


levelBase::levelBase(void)
{
	texture.loadFromFile("resources/blocks1.png"); 
}


levelBase::~levelBase(void)
{
}


//Returns the particular tile from the grid
static sf::Sprite getTile(levelBase::Tile tile){

	sf::Sprite sprite; 
	  

	switch(tile){

	case levelBase::GrassLeft:
		{
			return sf::Sprite(texture, sf::Rect<int>(172,36,31,31)); 
		}

	case levelBase::Grass1:
		{
			 return sf::Sprite(texture, sf::Rect<int>(206,36,31,31));
		}

	case levelBase::Grass2:
		{
			 return sf::Sprite(texture, sf::Rect<int>(240,36,31,31));
		}

	case levelBase::Grass3:
		{
			 return sf::Sprite(texture, sf::Rect<int>(274,36,31,31));
		}
	
	case levelBase::Grass4:
		{
			 return sf::Sprite(texture, sf::Rect<int>(308,36,31,31));
		}
	
	case levelBase::GrassRight:
		{
			return sf::Sprite(texture, sf::Rect<int>(342,36,31,31)); 
		}
	
	case levelBase::Dirt:
		{
			return sf::Sprite(texture, sf::Rect<int>(138,2,31,31)); 
		}

	} 

} 



levelOne.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef __Game__levelOne__
#define __Game__levelOne__


#include "levelBase.h" 



//Inherits from the levelBase class. 
class levelOne :
	public levelBase
{

public:
	levelOne(sf::RenderWindow& window); 
	~levelOne(void);

	void drawMap(); 
};

#endif 


levelOne.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "levelOne.h"


/*
Used to represent a level. 

Contains the level in an array and is responsible for drawing it on the screen. 
/**/ 


//An ugly temp map. 
const levelBase::Tile map[1024][768] = {
	{levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBase::Dirt,levelBa
};



levelOne::levelOne(sf::RenderWindow& window)  
{
}


levelOne::~levelOne(void)
{
}

void drawMap(sf::RenderWindow& window){

	for(int i = 0; i < 1024; i++){

		for(int j = 0; j < 768; j++){
			levelBase::Tile tile = map[i][j]; 
			window.draw(levelBase::getTile(tile)); 
		} 

	}

	window.display(); 

} 


I figured I would make levelBase as static as possible as it doesn't need to be created each and every time a new level is created. Thank you for any help.

You need to put levelBase:: in front of the definition of your static function.
So, something like this?

 
static sf::Sprite levelBase::getTile(Tile tile);



and in the cpp file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
sf::Sprite levelBase::getTile(levelBase::Tile tile){

	sf::Sprite sprite; 
	  

	switch(tile){

	case levelBase::GrassLeft:
		{
			return sf::Sprite(texture, sf::Rect<int>(172,36,31,31)); 
		}

	case levelBase::Grass1:
		{
			 return sf::Sprite(texture, sf::Rect<int>(206,36,31,31));
		}

	case levelBase::Grass2:
		{
			 return sf::Sprite(texture, sf::Rect<int>(240,36,31,31));
		}

	case levelBase::Grass3:
		{
			 return sf::Sprite(texture, sf::Rect<int>(274,36,31,31));
		}
	
	case levelBase::Grass4:
		{
			 return sf::Sprite(texture, sf::Rect<int>(308,36,31,31));
		}
	
	case levelBase::GrassRight:
		{
			return sf::Sprite(texture, sf::Rect<int>(342,36,31,31)); 
		}
	
	case levelBase::Dirt:
		{
			return sf::Sprite(texture, sf::Rect<int>(138,2,31,31)); 
		}

	} 

} 


It seemed to have worked. Is that the proper way to declare a static method?
Topic archived. No new replies allowed.