C++ 无法构造对象

C++ 无法构造对象,c++,c++11,C++,C++11,我花了最后两个小时试图弄明白为什么下面的代码无法编译,结果一无所获。我的代码的相关部分如下(完整代码在此处(hpp)和(cpp)(如果需要): /* 文件:du1simd.hpp */ #包括 #包括 #包括 模板 类simd_向量; 模板 类simd_向量迭代器 :public std::迭代器{ 类型定义 typename simd_向量::迭代器 自交型; 类型定义 类型名称std::迭代器::指针 指针; 类型定义 typename std::iterator::reference 参考

我花了最后两个小时试图弄明白为什么下面的代码无法编译,结果一无所获。我的代码的相关部分如下(完整代码在此处(hpp)和(cpp)(如果需要):

/*
文件:du1simd.hpp
*/
#包括
#包括
#包括
模板
类simd_向量;
模板
类simd_向量迭代器
:public std::迭代器{
类型定义
typename simd_向量::迭代器
自交型;
类型定义
类型名称std::迭代器::指针
指针;
类型定义
typename std::iterator::reference
参考文献;
类型定义
typename std::迭代器::值\类型
价值类型;
类型定义
类别名
标准::迭代器::差分类型
不同类型;
公众:
simd_向量迭代器()
:ptr_(nullptr){}
显式simd_向量迭代器(指针ptr)
:ptr_(ptr){}
显式simd_向量迭代器(const self_type和other)
:ptr_(other.ptr_){}
显式simd_向量迭代器(自类型和其他)
:ptr_(其他.ptr_){
other.ptr u=空ptr;
}
/*
随机访问迭代器的运算符在这里
*/
私人:
指针ptr;
};
模板
simd_向量迭代器
运算符+(std::ptrdiff_t n,simd_向量迭代器a){
返回a+=n;
}
模板
simd_向量迭代器
运算符-(std::ptrdiff\u t n,simd\u向量\u迭代器a){
返回a-=n;
}
模板
类simd_向量{
公众:
typedef simd_向量迭代器迭代器;
显式simd_向量(std::size_t s)抛出(std::bad_alloc){
指向分配内存的指针=
::新操作员(sizeof(T)*s+sizeof(s));
uintpttr\u t指针\u指向\u分配的\u内存=
(uintptr)指向分配内存的指针;
uintpttr\u t指向已分配内存的指针=
指向已分配内存+大小的指针
-指向已分配内存%sizeof(S)的指针;
数据=重新解释强制转换(指向已分配内存的指针);
数据=重新解释转换(指向已注册内存的指针);
}
~simd_向量(){
::运算符删除(指向分配内存的指针);
}
迭代器begin(){
迭代器i(数据);
返回i;
}
迭代器结束(){
/*...*/
}
std::size\u t size(){
返回计数;
}
/*...*/
私人:
void*指向分配内存的指针;
标准::大小\u t计数\u;
S*数据;
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;
}
/*
文件:du1simd.cpp
*/
#包括“du1simd.hpp”
typedef int T;
结构{
Tα,b,c;
};
int main(int argc,字符**argv){
simd_矢量sv(5);
*(sv.begin())=1;
返回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
du1simd.cpp中包含的文件中的
:8:0:
du1simd.hpp:在“simd_向量::迭代器simd_向量::begin()[with T=int;S=S;simd_向量::迭代器=simd_向量迭代器]”的实例化中:
du1simd.cpp:17:16:从这里开始需要
du1simd.hpp:192:16:错误:调用“simd_vector_iterator::simd_vector_iterator(simd_vector::iterator&)”时没有匹配的函数
返回i;
^
du1simd.hpp:192:16:注:候选人为:
du1simd.hpp:59:5:注意:simd_vector_iterator::simd_vector_iterator()[带T=int;S=S]
simd_向量迭代器()
^
du1simd.hpp:59:5:注意:候选者需要0个参数,提供1个
我想这告诉我我没有合适的构造函数,当我看simd_vector_迭代器的代码时,我看到了与签名匹配的构造函数(IMHO):/

有谁能帮我做这件事吗


披露:是的,这是家庭作业辅导。不,我不想有人帮我完成。我只是需要有关“无法编译”情况的帮助。

似乎您在
begin()
中正确构造了迭代器,但当您返回
I
时,需要制作副本。因此,编译器希望使用复制构造函数(
simd\u vector\u迭代器(const simd\u vector\u迭代器&)
,该构造函数不存在

解决方案可以是添加默认副本构造函数:

simd_vector_iterator(const simd_vector_iterator&) = default;

似乎您在
begin()
中正确构造了迭代器,但当您返回
i
时,需要进行复制。因此,编译器希望使用复制构造函数(
simd\u vector\u迭代器(const simd\u vector\u iterator&))
,该构造函数不存在

解决方案可以是添加默认副本构造函数:

simd_vector_iterator(const simd_vector_iterator&) = default;

VS2013引发以下错误,其中包含更好的消息:

错误C2558:类“simd_向量迭代器”:无复制构造函数 可用或复制构造函数声明为“显式”

删除副本构造函数上的
explicit
关键字就足够了:

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

VS2013引发以下错误,其中包含更好的消息:

错误C2558:类“simd_向量迭代器”:无复制构造函数 可用或复制构造函数声明为“显式”

删除副本构造函数上的
explicit
关键字就足够了:

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

但是带有这个签名的构造函数已经在那里了,simd_vector_iterator(const self_type&)…@Paladin您的原始副本ctor不一样,因为它被标记为显式。因此这是一个正确的答案。不,确切地说,我试图添加您的行,但编译器抛出了新的错误,无法重载。因为具有此签名的构造函数已经存在。删除“显式”解决了。@Paladin抱歉,我在回答之前没有看到复制构造函数,这里很早:-)@const\u ref你能解释一下为什么
explicit
阻止通过复制构造迭代器吗?但是带有此签名的构造函数已经在那里了,simd\u vector\u迭代器(const self\u type&)…@Paladin您的原始副本ctor不一样,因为它被标记为显式。因此这是一个正确的答案。不完全正确,我试图添加您的行,但编译器抛出