我花了两个小时试图弄清楚为什么下面的代码无法编译,但我什么也没得到。我的代码的相关部分如下(完整代码在这里 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/