ciao.
Sto procedendo con lo studio dei template su di un applicazione reale.
Adesso il problema è questo:
La classe CRenderer è inclusa sia nella classe CMesh del tipo:
template< class SHADER > class CMesh;
sia nella classe CEffect che non è un template.

il problema è quindi il riferimento circolare se aggiungo un CEffect o un CMesh.
volevo evitarlo con una forward declaration per i template su CMesh e CEfect.

codice:
#pragma once
#include <memory>
#include <list>
#include <string>
#define GLM_SWIZZLE
#include "../../glm/glm.hpp"
#include "../../glm/gtc/matrix_transform.hpp"

using namespace std;

namespace OPEN{
class CEffect;
template< class SHADER > class CMesh;
class CRenderer{
public:	
	typedef list< CMesh<CEffect> > EntityList;
	EntityList  m_pEntityList;
	CRenderer()
	{
		m_nSizeEntities = 0;
		//m_EntityList.clear();
	}

	CRenderer(const float &fLeft, const float& fRight, const float& fBottom, const float& fTop)
	{
		m_fLeft = fLeft;
		m_fRight = fRight;
		m_fBottom = fBottom;
		m_fTop = fTop;
		GlChangeOrthoMatrix(fLeft, fRight, fBottom, fTop);
		//m_pEntityList = new list< CMesh<CEffect>* >();
	}


	~CRenderer(void)
	{
	}

	//funzione che viene invocata prima del render di tutte le entità, setto qui le costanti della fase di disegno(matrici MVP ecc....)
	//per il binding automatico che verrà effettuato nel render sugli shader che hanno quella costante, 
	//TODO mettere qui anche la cancellazione dei buffer

	void preRender()
	{

	}

	//eseguo il render delle entità 
	void Render()
	{
		list< CMesh<CEffect> >::iterator iEntity = m_pEntityList.begin()	, iEntityEnd = m_pEntityList.end();
		for(; iEntity != iEntityEnd; ++iEntity)
		{	
		
			(*iEntity).DrawGl(this);
		}
	}

	glm::mediump_mat4x4 getMVP()
	{
		return m_MP;
	}

	void GlChangeOrthoMatrix(const float &fLeft, const float& fRight, const float& fBottom, const float& fTop)
	{
		m_MP = glm::ortho( fLeft, fRight, fBottom, fTop);
		//m_MP = glm::scale(m_MP, glm::detail::tvec3<float>( 10., 10., 10.1));
	}


	void init()
	{
		GlChangeOrthoMatrix(m_fLeft, m_fRight, m_fBottom, m_fTop);
	}

	private:
		glm::mediump_mat4x4 m_MP; //! matrice model view projection		
		float m_fLeft;//!left della viewport
		float m_fRight;//!right della viewport
		float m_fBottom;//!bottom della viewport
		float m_fTop;//!top della viewport
		int m_nSizeEntities;
	};

	typedef shared_ptr<CRenderer> ptrRenderer;
}
ma mi da quest errore:
codice:
3>------ Build started: Project: qtgltest, Configuration: Debug x64 ------
3>  GlWidgetImage.cpp
3>C:\Open2\Open2\include\Renderer.hpp(55): error C2027: use of undefined type 'OPEN::CMesh<SHADER>'
3>          with
3>          [
3>              SHADER=OPEN::CEffect
3>          ]
3>C:\Open2\Open2\include\Renderer.hpp(55): error C2228: left of '.DrawGl' must have class/struct/union
========== Build: 2 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

potete aiutarmi?
grazie.