Compiler says no appropriate operator^ is defined. But there seems to be one defined...
Code:
error: no match for ‘operator^’ in ‘num ^ power::p(3u)’
Code:
#include <cassert>
#include <cmath>

namespace power
{

	struct mult_p
	{
		mult_p(unsigned int n_) : n(n_) {}
		unsigned int n;
	};
	
	struct p
	{
		p(unsigned int n_) : n(n_) {}
		unsigned int n;
		mult_p & operator *() { return mult_p(n); }
	};
}

template<class T>
T operator ^ (T & left, power::p & right)
{
   if(!right.n) return T(1);
   T ret = left;
   for(unsigned int i = 1; i < right.n; ++i)
	ret *= left;
   return ret;
}

template<class T>
T operator * (T & left, power::mult_p & right)
{
   if(!right.n) return T(1);
   T ret = left;
   for(unsigned int i = 1; i < right.n; ++i)
	ret *= left;
   return ret;
}

int main()
{
	using namespace power;
	int num = 23;
	int x = std::pow(static_cast<double>(num),3);
	int y = num**p(3); // == x
	int z = num^p(3);  // == x
	assert(x == y && x == z);
}
What am I missing?
- Thanks