在我的问题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 ++的新手
答案 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;
}
答案 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;
};