我花了两个小时试图找出为什么下面的代码不能编译,而我什么也没有得到。我的代码的相关部分如下(完整代码在这里http://pastebin.com/z78iy3AA (hpp)和http://pastebin.com/5mC6TwET (如果需要的话):
/*
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代码时,我看到了与签名匹配的构造函数:/
有人能帮我这个忙吗?
披露:是的,这是家庭作业安排。不,我不想有人帮我完成它。我只是需要帮助解决这个“不会编译”的情况。
发布于 2014-03-10 08:07:58
VS2013抛出以下错误,其中包含更好的消息:
错误C2558:类'simd_vector_iterator‘:没有可用的复制构造函数,也没有副本构造函数声明为’显式‘
删除复制构造函数上的explicit关键字就足够了:
simd_vector_iterator(const self_type & other) : ptr_(other.ptr_) {}发布于 2014-03-10 08:02:25
似乎您在begin()中正确地构造了迭代器,但是当您返回i时,需要创建一个副本。因此,编译器希望使用复制构造函数(simd_vector_iterator(const simd_vector_iterator&),它不存在)。
解决方案可以是添加默认副本构造函数:
simd_vector_iterator(const simd_vector_iterator&) = default;https://stackoverflow.com/questions/22294776
复制相似问题