开发者

Access typedefs of previous template parameters in template parameter list?

开发者 https://www.devze.com 2023-04-05 00:56 出处:网络
I\'am wondering whether it is possible to access type definitions of types which are given as previous template parameters in later template parameters in a template parameter list like so:

I'am wondering whether it is possible to access type definitions of types which are given as previous template parameters in later template parameters in a template parameter list like so:

#include <iostream>

template<typename V>
struct TypeHolder {
    typedef V value_type;
开发者_如何学Go};

template<typename T, T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
};

int main() {
    typedef TypeHolder<int> IntTypeHolder;
    typedef ValueHolder<IntTypeHolder,5> Five;

    std::cout << Five::value << std::endl;

    return 0;
}

When I compile the above example I get the following error:

damian@damian-HP-EliteBook-8440p:~$ g++ -o cpptest test.cpp

test.cpp:8:25: error: 'T::value_type' is not a type

Is this due to wrong syntax or is what I'm trying to do just not possible in c++?


It's possible. You are missing the keyword typename.

 template<typename T, typename T::value_type v>
 struct ValueHolder { ^^^^^^^^
   ...

You have to inform the compiler that T::value_type is a type. Demo.


If you prefix typename to the template parameter it compiles:

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
}

The use of typename helps the compiler know that in this case the identifier value_type referenced within the T:: namespace is a type and not a member function or variable.


Try the following:

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
};

You for got to prefix "typename" to your T:value_type ... unfortunately just because value_type is a typedef member of T does not mean that the C++ parser can tell. It may be an actual static data member, static method, etc. Therefore when accessing fully-qualified types in other namespaces/classes, you have to prefix them with typename.


It is due to wrong syntax, what you try to do with T::value_type v is to get a value right?

Then better use something like that :

template<typename T>
struct ValueHolder {
    const static typename T::value_type value;
    ValueHolder(typename T::value_type v)
    {
        ValueHolder::value = v;
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消