C ++中的'using type'会导致多个错误

时间:2014-12-14 15:39:37

标签: c++ templates types

在我的问题type as returntype in c++中,我得到了答案 给了我这样一个结构:

template <int N>
struct int_type {
    using type = std::conditional_t<N <= 8, std::uint8_t,
                 std::conditional_t<N <= 16, std::uint16_t,
                 std::conditional_t<N <= 32, std::uint32_t,
                 std::conditional_t<N <= 64, std::uint64_t,
                 std::uintmax_t>>>>;
};

这似乎完全符合我的需要,但实践看起来有所不同,因为我无法编译它,因为以下错误:

...Error: expected nested-name-specifier before 'type'
 using type = std::conditional_t<N <= 8, std::uint8_t,
       ^
...Error: using-declaration for non-member at class scope
...Error: expected ';' before '=' token
 using type = std::conditional_t<N <= 8, std::uint8_t,
            ^
...Error: expected unqualified-id before '=' token

我试图谷歌,但我发现的帖子似乎都没有解决这个具体问题。任何人都可以解释我这个代码有什么问题吗?我是C ++的新手

3 个答案:

答案 0 :(得分:2)

只要您的编译器支持为<type_traits>特征定义别名模板的C ++ 14 stdlib std::conditional,您的代码就完全合法。

但是,错误消息清楚地表明您甚至没有启用C ++ 11,因此using根本不会被解析为别名。为此,请在配置中添加-std=c++11-std=c++14选项。

如果你不能,那么在C ++ 03中你可以轻松实现自己的conditional特性:

template <bool B, typename T, typename F>
struct conditional
{
    typedef T type;
};

template <typename T, typename F>
struct conditional<false, T, F>
{
    typedef F type;
};

template <int N>
struct int_type {
    typedef typename conditional<N <= 8, uint8_t,
                 typename conditional<N <= 16, uint16_t,
                 typename conditional<N <= 32, uint32_t,
                 typename conditional<N <= 64, uint64_t,
                 uintmax_t>::type>::type>::type>::type type;
};

在C ++ 11中,您可以使用std::conditional代替std::conditional_t,唯一的区别是您需要自己访问嵌套的typedef type,这是一个依赖名称嵌套名称说明符前面需要typename个关键字):

#include <cstdint>
#include <type_traits>

template <int N>
struct int_type {
    using type = typename std::conditional<N <= 8, std::uint8_t,
                 typename std::conditional<N <= 16, std::uint16_t,
                 typename std::conditional<N <= 32, std::uint32_t,
                 typename std::conditional<N <= 64, std::uint64_t,
                 std::uintmax_t>::type>::type>::type>::type;
};

在C ++ 11 / C ++ 14中,您需要包含<cstdint>而不是<stdint.h>。前者保证名称在std命名空间中定义(后者可以仅在全局命名空间中定义它们。)

答案 1 :(得分:0)

为了完整起见,我在这里添加一个答案。

您需要#include <cstdint>#include <type_traits>,然后使用C ++ 14支持进行编译。代码:

#include <type_traits>
#include <cstdint>
#include <iostream>

template <int N>
struct int_type {
    using type = std::conditional_t<N <= 8, std::uint8_t,
                 std::conditional_t<N <= 16, std::uint16_t,
                 std::conditional_t<N <= 32, std::uint32_t,
                 std::conditional_t<N <= 64, std::uint64_t,
                 std::uintmax_t>>>>;
};

int main()
{
    int_type<10>::type t; // std::uint16_t
    t = 12;
    std::cout << t << std::endl;
}

实例:http://coliru.stacked-crooked.com/a/9352f3349f48bff4

答案 2 :(得分:-1)

嗯,当你做一个typedef时,编译器会告诉你什么是错的。这些是依赖类型名称,所以你需要一个&#34; typename&#34;在它面前。所以这应该有效:

#include <iostream>
#include <type_traits>
using namespace std;

template <int N>
struct int_type {
    using mytype = typename std::conditional<N <= 8, std::uint8_t,
                     typename std::conditional<N <= 16, std::uint16_t,
                       typename std::conditional<N <= 32, std::uint32_t,
                         typename std::conditional<N <= 64, std::uint64_t,
                           std::uintmax_t
                         >::type
                       >::type
                     >::type
                   >::type;
};