#include <iostream>
#include <cstdlib>
#include <string>
#include <typeinfo>

//////////////////////////////////////////////////////////////////////////////////////

class Bar
{
public:
	enum TYPE{};
};

//////////////////////////////////////////////////////////////////////////////////////

template<typename T>
class Foo
{
public:
	template<typename P>
	void setValue1();
	
	template<typename P, int>
	void setValue2();
	
	template<typename P, typename P::TYPE>
	void setValue3();

private:
	T	m_value;
};

//////////////////////////////////////////////////////////////////////////////////////

template<typename T>
template<typename P>
void Foo<T>::setValue1()
{
}

template<typename T>
template<typename P, int>
void Foo<T>::setValue2()
{
}

template<typename T>
template<typename P, typename P::TYPE>
void Foo<T>::setValue3()
{
}

//////////////////////////////////////////////////////////////////////////////////////

int main()
{
	Foo<Bar::TYPE> f1;
	
	f1.setValue1<Bar>();		// Compiles
	f1.setValue2<Bar, int>();	// ERROR
	f1.setValue3<Bar, Bar::TYPE>();	// ERROR
	
	return EXIT_SUCCESS;
}
    
//////////////////////////////////////////////////////////////////////////////////////
