1
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; 
taiyebur
  • 391
  • 4
  • 13

0 Answers0