开发者

Access typedefs of previous template parameters in template parameter list?

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

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜