class Liquid
{
public:
using value_type = Liquid;
Liquid(){}
};
class Water: public Liquid
{
public:
using value_type = Water;
Water(){}
};
class Oil: public Liquid
{
public:
using value_type = Oil;
Oil(){}
};
template<typename liquid>
class LiquidContainer
{
public:
using value_type = liquid;
std::size_t n_litre = 0;
LiquidContainer(std::size_t n_litre): n_litre{n_litre}{}
// liquid type used in imaginary functions
};
template<typename T>
using ElemType = typename T::value_type;
template<typename T>
void dummy_algo_who_takes_all_kinds_of_liquid_type(T& liquid)
{
// we want to create a vector of actual data type of T
std::vector<typename T::value_type> vec(6);
std::cout <<typeid(typename decltype(vec)::value_type).name() << std::endl; // 5Water
std::vector<ElemType<T>> vec2(7);
std::cout <<typeid(typename decltype(vec)::value_type).name() << std::endl; // 5Water
std::vector<T> vec3(4);
std::cout <<typeid(typename decltype(vec3)::value_type).name() << std::endl; // 5Water
}
void test_value_type()
{
std::list<int> a {0};
std::cout << typeid(decltype(a)::value_type).name() << std::endl; //i
std::vector<double> veci{2,2};
std::cout << typeid(decltype(veci)::value_type).name() << std::endl; // d
LiquidContainer<Water> galon(6);
std::cout << typeid(decltype(galon)::value_type).name() << std::endl; // 5Water
decltype(galon) newGalon(7);
std::cout << typeid(decltype(newGalon)::value_type).name() << std::endl; // 5Water
std::cout << typeid(decltype(newGalon)).name() << std::endl; // 15LiquidContainerI5WaterE
decltype(galon)::value_type liquid;
dummy_algo_who_takes_all_kinds_of_liquid_type(liquid);
}
In the above code sample if I ignore the "typename" keyword in "dummy_algo_who_takes_all_kinds_of_liquid_type" function, the compiler throws the following error. What is it saying in the message? What I am confused about is what do "parsed as non-type" and "instantiation yield a type" mean?
error: dependent-name ‘decltype (vec3)::value_type’ is parsed as a non-type, but instantiation yields a type
std::cout <<typeid(decltype(vec3)::value_type).name() << std::endl;