小编Sha*_*gor的帖子

cbegin/cend对于基于循环的范围是不够的?

我有一个类,我们称之为ConstVector,它只定义cbegin/cend而不是begin/end,因为我不想在构造之后允许对其成员进行修改.我尝试使用基于for循环的范围,如下所示:

ConstVector const_vector(1, 2, 3);
for(const auto &x : const_vector)
....
Run Code Online (Sandbox Code Playgroud)

虽然该课程的相关部分如下所示:

template<class T>
class ConstVector
{
    public:
        ConstVector(std::initializer_list<T> values);
        typename std::vector<T>::const_iterator cbegin(void) const;
        typename std::vector<T>::const_iterator cend(void) const;

    private:
        std::vector<T> data;
};

template<class T>
ConstVector::ConstVector(std::initializer_list<T> values)
    : data(values)
{
}

template<class T>
typename std::vector<T>::const_iterator ConstVector<T>::cbegin() const
{
    return this->data.cbegin();
}

template<class T>
typename std::vector<T>::const_iterator ConstVector<T>::cend() const
{
    return this->data.cend();
}
Run Code Online (Sandbox Code Playgroud)

但我的编译器抱怨:

‘begin’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

我的问题是:我必须实现开始/结束吗?据我所知,它应该选择cbegin/cend,如果它const auto &x不是auto &x.至少这对我来说是有意义的.如果我删除基于for循环的范围,一切都编译得很好.

我也尝试过这里提出的所有内容const …

c++

9
推荐指数
1
解决办法
674
查看次数

C++模板在通过函数签名时不编译

考虑以下最小的例子(没有#1和编译#2):

void foo(void)
{ }

template<typename T> class Stage2;

template<typename Ret, typename... Args>
struct Stage2<Ret (Args...)>
{
    template<Ret (*func)(Args...)>
    static void foobar(void)
    { /* Do something */ }
};

template<typename FuncType>
struct Stage1
{
    template<FuncType func>
    static void bar(void)
    {
        Stage2<FuncType>::foobar<func>();       // #1, Not working
        Stage2<decltype(func)>::foobar<func>(); // #2, Not working
        Stage2<void()>::foobar<func>();         // #3, Working
    }
};

int main(void)
{
    Stage1<decltype(foo)>::bar<foo>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么它不能编译#1#2,而它编译得很好#3?在我看来,#3只要foo具有签名void(),它应该等同于其他人,在本例中它就是这样.甚至编译器也告诉我,FuncType实际上就是这样 …

c++ templates

7
推荐指数
1
解决办法
483
查看次数

标签 统计

c++ ×2

templates ×1