c++ - 无法构造对象

标签 c++ c++11

我花了两个小时试图弄清楚为什么下面的代码无法编译,但我什么也没得到。我的代码的相关部分如下(完整代码在这里 http://pastebin.com/z78iy3AA (hpp) 和 http://pastebin.com/5mC6TwET (cpp) 如果需要的话):

/*
File: du1simd.hpp
*/

#include <iterator>
#include <cstdint>
#include <new>

template< typename T, typename S>
class simd_vector;

template<typename T, typename S>
class simd_vector_iterator
    : public std::iterator<std::random_access_iterator_tag, T> {
    typedef
        typename simd_vector<T, S>::iterator
        self_type;
    typedef
        typename std::iterator<std::random_access_iterator_tag, T>::pointer
        pointer;
    typedef
        typename std::iterator<std::random_access_iterator_tag, T>::reference
        reference;
    typedef
        typename std::iterator<std::random_access_iterator_tag, T>::value_type
        value_type;
    typedef
        typename
            std::iterator<std::random_access_iterator_tag, T>::difference_type
        difference_type;
 public:
    simd_vector_iterator()
        : ptr_(nullptr) {}
    explicit simd_vector_iterator(pointer ptr)
        : ptr_(ptr) {}
    explicit simd_vector_iterator(const self_type & other)
        : ptr_(other.ptr_) {}
    explicit simd_vector_iterator(self_type && other)
        : ptr_(other.ptr_) {
        other.ptr_ = nullptr;
    }

    /*
    Operators for random access iterator are here
    */

 private:
    pointer ptr_;
};

template< typename T, typename S>
simd_vector_iterator< T, S>
operator+(std::ptrdiff_t n, simd_vector_iterator< T, S> a) {
    return a += n;
}

template< typename T, typename S>
simd_vector_iterator< T, S>
operator-(std::ptrdiff_t n, simd_vector_iterator< T, S> a) {
    return a -= n;
}

template<typename T, typename S>
class simd_vector {
 public:
    typedef simd_vector_iterator<T, S> iterator;

    explicit simd_vector(std::size_t s) throw(std::bad_alloc) {
        pointer_to_allocated_memory_ =
            ::operator new(sizeof(T) * s + sizeof(S));

        uintptr_t pointer_to_allocated_memory =
            (uintptr_t) pointer_to_allocated_memory_;
        uintptr_t pointer_to_alligned_memory =
            pointer_to_allocated_memory + sizeof(S)
            - pointer_to_allocated_memory % sizeof(S);
        data_s_ = reinterpret_cast<S*>(pointer_to_alligned_memory);
        data_t_ = reinterpret_cast<T*>(pointer_to_alligned_memory);
    }

    ~simd_vector() {
        ::operator delete(pointer_to_allocated_memory_);
    }

    iterator begin() {
        iterator i(data_t_);
        return i;
    }

    iterator end() {
        /*...*/
    }

    std::size_t size() {
        return count_;
    }

    /*...*/

 private:
    void * pointer_to_allocated_memory_;
    std::size_t count_;
    S * data_s_;
    T * data_t_;
};

和测试代码:

/*
File: du1simd.cpp
*/

#include "du1simd.hpp"

typedef int T;
struct S {
    T a, b, c;
};

int main(int argc, char ** argv) {
    simd_vector<T, S> sv(5);
    *(sv.begin()) = 1;
    return 0;
}

当我尝试编译它时,我看到以下错误:

In file included from du1simd.cpp:8:0:
du1simd.hpp: In instantiation of ‘simd_vector<T, S>::iterator simd_vector<T, S>::begin() [with T = int; S = S; simd_vector<T, S>::iterator = simd_vector_iterator<int, S>]’:
du1simd.cpp:17:16:   required from here
du1simd.hpp:192:16: error: no matching function for call to ‘simd_vector_iterator<int, S>::simd_vector_iterator(simd_vector<int, S>::iterator&)’
         return i;
                ^
du1simd.hpp:192:16: note: candidate is:
du1simd.hpp:59:5: note: simd_vector_iterator<T, S>::simd_vector_iterator() [with T = int; S = S]
     simd_vector_iterator()
     ^
du1simd.hpp:59:5: note:   candidate expects 0 arguments, 1 provided

我认为这告诉我我没有合适的构造函数,当我查看 simd_vector_iterator 的代码时,我看到构造函数(恕我直言)与签名匹配:/

有人愿意帮助我吗?

披露:是的,这是一项家庭作业。不,我不想让别人帮我完成它。我只需要帮助解决这种“无法编译”的情况。

最佳答案

VS2013 抛出以下错误,其中有更好的消息:

error C2558: class 'simd_vector_iterator' : no copy constructor available or copy constructor is declared 'explicit'

删除复制构造函数上的显式关键字就足够了:

simd_vector_iterator(const self_type & other) : ptr_(other.ptr_) {}

关于c++ - 无法构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22294776/

相关文章:

c++ - 用编程语言管理库和导入

c++ - 我在哪里放置第三方库来设置 C++ Linux 开发环境?

c++ - 为什么我必须释放二维数组两次以避免内存泄漏?

c++ - 管理多个并发线程

c++ - std::function 的目的是什么以及如何使用它?

C++:可以优化未使用的 lambda 显式捕获吗?

c++ - 如何在中等规模的项目中诊断 g++ 错误 "cc1plus.exe: out of memory allocating 838860800 bytes"?

c++ - 将 braced-init-list 分配给数组是否正确?

c++ - cv-qualified struct 的成员不是类似的 cv-qualified

c++ - 为什么 std::priority_queue 对其容器的元素进行排序?