2009-12-16 2 views
0

템플릿 코드가 다소 복잡한 구조로 작동하려고합니다.C++ 멋진 템플릿 코드 문제

내가 무엇을 :이 * 키로서 사용 포인터가 실제로 포인터 제네릭 형식

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의 클래스 shaderProperty입니다 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; 
}; 

이제 오류가 내가

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

얻을 함수를 인라인 T getValue()

의 첫 번째 줄에 발생하지만 난 왜 이해가 안 나는 ShaderMatth 템플릿의 구조체 선언을 가지고 있고 두 번째 코드 묶음에는 첫 번째 코드 묶음이 포함되어 있으므로 앞으로 참조가 제대로 작동하지 않을까요? 내가 매달려있어

- 앞으로 ShaderMatth를 선언하는 코드 shaderMatth->properties를 사용하는 것만으로는 충분하지 않습니다 :

답변

3

도와주세요.

해당 줄 앞에 정의해야합니다.

+1

실제로 이것이 기술적으로 사실이며 표준에 의해 요구되는 반면 MSVC++ (오류 코드로 판단하면 OP가 사용하는 것임)는 상당히 엄격하지 않습니다. 단지 함수 앞에 완전히 유형을 선언해야합니다 인스턴스화 될 수 있습니다. Shmoopty가 말했듯이, 당신이 모든 휴대용 장치에 있기를 원하면, 그렇게하십시오; GCC는 훨씬 덜 편안합니다 :) – moonshadow

+0

감사! 너희들은 좋다 :) 대답을 결론 짓는 : 제 경우에는 함수를 별도의 파일로 구현해야합니다. 그러면 모든 것이 잘되었습니다! – Mat