Господа,
Сижу, пишу на С++, никого не трогаю, однако же возникает чувство незнания языка, недопонимания возможностей, правил либо присутствие ограничений
К делу. https://gist.github.com/teyrnon/872c8f0cf07f6659992e - бессмысленная попытка посмотреть на compile-time вычисления на шаблонах, реализовать подобие fmap
tp<unsigned N, unsigned D>
struct frac_t {
enum {
n = N,
d = D,
};
};
tp<unsigned A> struct mult {
tp<unsigned B> struct apply {
enum { value = A * B, };
};
};
tp< class Func, class Frac> struct fmap {
tp<unsigned V>
using apply_test = typename Func::apply<V>;
using value = frac_t<
Func::apply< Frac::n >::value,
Func::apply< Frac::d >::value >;
};
std::cout << fmap< mult<2u>, frac_t<1u,2u> >::value();
Как поправить данную конструкцию?
*UPD* лог компилятора
g++ -c -pipe -std=c++11 -g -Wall -W -fPIE -I../Monads -I. -I../../Qt/5.4/gcc_64/mkspecs/linux-g++ -o main.o ../Monads/main.cpp
../Monads/main.cpp:32:44: error: expected ';' before '<' token
using apply_test = typename Func::apply<V>;
^
../Monads/main.cpp:32:44: error: expected unqualified-id before '<' token
../Monads/main.cpp:35:31: error: wrong number of template arguments (1, should be 2)
Func::apply< Frac::n >::value,
^
../Monads/main.cpp:7:8: error: provided for 'template<unsigned int N, unsigned int D> struct frac_t'
struct frac_t {
^
../Monads/main.cpp: In instantiation of 'struct fmap<mult<2u>, frac_t<1u, 2u> >':
../Monads/main.cpp:44:49: required from here
../Monads/main.cpp:32:44: error: 'typename mult<2u>::apply' names 'template<unsigned int B> struct mult<2u>::apply', which is not a type
using apply_test = typename Func::apply<V>;
^
../Monads/main.cpp: In function 'int main(int, const char**)':
../Monads/main.cpp:44:18: error: 'value' is not a member of 'fmap<mult<2u>, frac_t<1u, 2u> >'
std::cout << fmap< mult<2u>, frac_t<1u,2u> >::value();
^
make: *** [main.o] Error 1