Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ enum won';不能使用类似模板的代码_C++_Templates_Enums - Fatal编程技术网

C++ enum won';不能使用类似模板的代码

C++ enum won';不能使用类似模板的代码,c++,templates,enums,C++,Templates,Enums,我试图通过STL模拟boost::iterator_范围和boost::counting_迭代器。代码似乎正常工作,但当我尝试向其传递枚举元素时,会出现以下错误: 错误2错误C2100:非法间接寻址 错误1错误C2675:一元“++”:“‘匿名命名空间’::块_边” 未定义此运算符或转换为用户可接受的类型 预定义运算符 如何修复这些错误 代码 #include <iostream> namespace { enum Block_Edges { FRO

我试图通过STL模拟boost::iterator_范围和boost::counting_迭代器。代码似乎正常工作,但当我尝试向其传递枚举元素时,会出现以下错误:

错误2错误C2100:非法间接寻址
错误1错误C2675:一元“++”:“‘匿名命名空间’::块_边” 未定义此运算符或转换为用户可接受的类型 预定义运算符

如何修复这些错误

代码

#include <iostream>

namespace
{
    enum Block_Edges
    {
        FROM = 0,
        TO = 4,
    };
};

template<typename T, bool enable = std::is_integral<T>::value>
struct range_impl
{
    struct iterator
    {
        const T operator * ()const noexcept
        {
            return value;
        }

        iterator& operator ++() noexcept
        {
            ++value;
            return *this;
        }

        friend  const bool operator != (const iterator& lhs, const iterator& rhs) noexcept
        {
            return lhs.value != rhs.value;
        }

        T value;
    };

    std::size_t size() const
    {
        return last - first;
    }

    const iterator begin()const noexcept
    {
        return{ first };
    }

        const iterator end()const noexcept
    {
        return{ last };
    }

    T first;
    T last;
};

template<typename T>
struct range_impl<T, false>
{
    range_impl(T first, T last)
        : first(first)
        , last(last)
    {}

    std::size_t size() const
    {
        return std::distance(first, last);
    }

    const T begin()const noexcept
    {
        return{ first };
    }

        const T end()const noexcept
    {
        return{ last };
    }

    T first;
    T last;
};

template<typename T>
range_impl<T>  range(T first, T last) noexcept
{
    return{ first, last };
}

int main()
{
    //for (const auto& i : range(0, 4)) // PASS
    //{
    //  std::cout << '\n' << i << ':';
    //  for (const auto& j : range(0, 4))
    //  {
    //      std::cout << j << ' ';
    //  }
    //}

    for (const auto& i : range(Block_Edges::FROM, Block_Edges::TO)) // FAILED
    {
        std::cout << '\n' << i << ':';
        for (const auto& j : range(Block_Edges::FROM, Block_Edges::TO))
        {
            std::cout << j << ' ';
        }
    }
}
#包括
名称空间
{
枚举块_边
{
FROM=0,
TO=4,
};
};
模板
结构范围
{
结构迭代器
{
常量T运算符*()常量noexcept
{
返回值;
}
迭代器和运算符++()noexcept
{
++价值观;
归还*这个;
}
friend const bool运算符!=(const迭代器和lhs、const迭代器和rhs)noexcept
{
返回lhs.value!=rhs.value;
}
T值;
};
std::size\u t size()常量
{
返回最后优先;
}
常量迭代器begin()常量noexcept
{
返回{first};
}
常量迭代器end()常量noexcept
{
返回{last};
}
T第一;
不持久;
};
模板
结构范围
{
范围\u impl(T第一,T最后)
:第一(第一)
,最后(最后)
{}
std::size\u t size()常量
{
返回标准::距离(第一个、最后一个);
}
常量T begin()常量noexcept
{
返回{first};
}
const T end()const noexcept
{
返回{last};
}
T第一;
不持久;
};
模板
范围\u impl range(T first,T last)无例外
{
返回{first,last};
}
int main()
{
//for(const auto&i:range(0,4))//通过
//{
//std::cout您有两个错误:

缺少此功能:

Block_Edges& operator++(Block_Edges& e)
{
    return e = static_cast<Block_Edges>(e + 1);
}

如果错误消息说你没有定义模板所需的运算符,那么也许你应该定义它?@Happy..好的,但我已经在
范围内定义了它\u impl
@Happy..我解决了它。它只需要强制转换。但是为什么它需要强制转换。非常糟糕的错误消息不,你做错了,让我稍后发布一个答案。“非常糟糕的错误消息”-对我来说似乎很好-你认为什么更好…?非常感谢,但我转到了另一个问题
(const auto&i:range(Block_Edges::FROM,Block_Edges::to-1))
不会编译。@凡人:
Block_-Edges::TO-1
int
Block_-Edges::FROM
enum
,因此
t
不能为
范围推断。您可以将
范围
更改为
模板范围(T1优先,T2最后)不例外或调用
范围(Block_-Edges::FROM,Block_-Edges::TO-1)
(或将
Block_-Edges::TO-1
转换到枚举)太好了…我将实现这些。我通过
为(const auto&i:range(Block_-Edges::FROM+0,Block_-Edges::TO-1))实现它,但我不喜欢它。
template<typename T,
         bool enable = std::is_integral<T>::value || std::is_enum<T>::value>
struct range_impl