Необычная проблема кода шаблона C ++ - PullRequest
0 голосов
/ 16 декабря 2009

Я пытаюсь заставить (для меня) довольно сложную конструкцию шаблонного кода работать.

что у меня есть: класс shaderProperty универсального типа

class IShaderProperty {
public:
virtual ~IShaderProperty() {}
};

struct IShaderMatth; //forward declaration
template<typename ShadeType>
struct ShaderMatth;//forward declaration

template <typename T> 
class ShaderProperty : public IShaderProperty
{
public:

 template <typename SomeType>
 inline T getValue(ShaderMatth<SomeType>* shaderMatth){
 pair<map<void*, IShaderMatth>::iterator,bool> success = shaderMatth->properties.insert(make_pair((void*)this, ShaderMatth<T>(m_shader)));
 assert(success.second);
 return m_shader->shade((ShaderMatth<T>*)&(*success.first));
 }

};

и класс ShaderMatth, который также имеет универсальный тип, и хранит карту, тогда как указатель void *, используемый в качестве ключа, фактически является указателем на ShaderProperty. Код для ShaderMatth:

#include "ShaderProperty.h"

struct IShaderMatth {
 virtual ~IShaderMatth() {}
 map<void*, IShaderMatth> properties;
...
};

template <class ReturnType> 
struct ShaderMatth : public IShaderMatth{
 ShaderMatth(IShader<ReturnType>* shaderPtr){shader=shaderPtr};
 ~ShaderMatth(void);
 IShader<ReturnType>* shader;
};

теперь ошибка возникает в первой строке функции inline T getValue ()

я получаю

Error C2027 use of undefined type 'ShaderMatth<ShadeType>'

но я не понимаю почему .. У меня есть предварительное объявление шаблонной структуры ShaderMatth, и во второй пакет кода я включаю первый пакет кода, так что прямая ссылка должна сработать, нет?

Я вешаю - помогите пожалуйста:)

1 Ответ

3 голосов
/ 16 декабря 2009

Вперед объявления ShaderMatth недостаточно для использования кода shaderMatth->properties.

Должен быть определен до этой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...