gpt4 book ai didi

c++ - 无法构造对象

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:40 24 4
gpt4 key购买 nike

我花了最后两个小时试图弄清楚为什么以下代码无法编译,但我一无所获。我的代码的相关部分如下(如果需要,完整代码在这里 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'

删除复制构造函数中的 explicit 关键字就足够了:

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com