下列代码合法吗?
class A
{
std::map<int, A>::iterator x;
};
Visual 2015接受它,但是clang说
.../ndk/sources/cxx-stl/llvm-libc++/libcxx/include/utility:254:9:
error: field has incomplete type 'A'
_T2 second;
^
....
a.cpp:52:21:
note: definition of 'A' is not complete until the clo
我对在C++中实例化的意义有点困惑。考虑以下代码(它在VC++2012下编译得很好):
struct Foo;
template <class T> Foo* Create() { return new Foo; }
Foo* MyFoo = Create<int>();
// (A) I expected point of instantiation to be here
struct Foo {};
// (B) But it appears to be here instead
我期望实例化点是上面的点(A),但显然不是这样的(因为Foo是点(A)处的不
当列表中的一个元素被销毁时,我希望遍历相同的列表,看看它是否包含另一个特定的元素。每次删除元素时,都必须执行此操作。 如果容器是std::vector,它工作得很好,但如果是std::list,它似乎会在for循环之外迭代并崩溃。 这是未定义的行为吗? (以下代码示例在Visual Studio 2017中工作,但在Visual Studio 2019中停止工作) #include <iostream>
#include <list>
class Element
{
public:
Element(std::list<Element> &
我正在浏览这个问题的答案,和其他一些问题,我明白我们可以省略第一个维度,但其他维度是不可避免的。
令我惊讶的是,以下代码执行得非常好:
#include<stdio.h>
void f1(int (*p)[]){
//SOMETHING
}
int main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
f1(a);
}
但是,如果我使用指针p来打印一些值,比如
printf("%d",p[0][1]);
它会给出一条错误消息,说明:
error: invalid use of array with unspeci
我收到以下错误:
class Test
{
std::map<std::string,Test> test;
};
错误是"Field有不完整的类型'Test'“。我读了一些帖子,暗示这可能是xcode附带的libcxx版本中的一个bug,但如果我只需将其更改为:
class Test
{
std::map<std::string,std::shared_ptr<Test>> test;
};
我只是想仔细检查一下,这绝对是一个正确的错误,而不是一个bug。
干杯!
int (*)[]可以是一个不完整的类型吗?
C 2018年6.2.5 1说:
在转换单元内的各个点,对象类型可能是不完整的(缺少足够的信息来确定该类型对象的大小)或完全的(具有足够的信息)。
因此,如果一个类型的大小已知,则该类型是完整的。6.2.6.1 28指定某些类型的指针必须具有相同的大小(指向void和字符的指针、指向兼容类型的指针、指向结构的指针和指向联合的指针),但是指向其他类型的指针可能有所不同。
在C实现中,所有指针或指向int数组的所有指针都具有相同的大小,那么int (*)[]的大小是已知的,因此它将是完整的。在一个实现中,比如说,对大型数组使用不同的指针,大小将不被知
这段代码:
class Foo {
std::unordered_map<std::string, Foo> x;
};
给我一个错误:
/usr/include/c++/4.7/bits/stl_pair.h:94:11:
error: 'std::pair<_T1, _T2>::second' has incomplete type
foo.cpp:4:7: error: forward declaration of 'class Foo'
class Foo {
std::vector<Foo> x
在下面的示例中,函数f()返回不完全类型的A被标记为已删除:
struct A;
A f() = delete;
GCC接受了这一建议,但在Clang案中却不接受,后者抱怨说:
error: incomplete result type 'A' in function definition
演示:
按照标准,哪个编译器就在这里?
我可以对模板类使用正向声明吗?
我试着:
template<class que_type>
class que;
int main(){
que<int> mydeque;
return 0;
}
template<class que_type>
class que {};
我得到了:
error: aggregate 'que<int> mydeque' has incomplete type and cannot be defined.
所以,多亏了这个网站,我找到了之前问题的答案。我正在向GNU automake项目中的一个类添加一个函数,该项目使用指向doc对象的指针。依赖项包含在Makefile.am文件中,以便按各自的顺序包含doc.h和plsa.h。但是,当我编译时,我会得到一个doc has not been declared错误。然后,我尝试在这里添加#include语句,这会给出一个previous redefinition of 'class doc'错误。
我了解到必须使用下面注释掉的class doc;行来声明doc;但是,我认为只有在声明通过值传递对象的函数时才需要这样做。有人能解释一下
据我所知,当使用对象返回类型定义函数时,类只处于如下的前向声明状态:
class A;
//转发声明,它将A设置为不完整类型
A foo(){...}
//error: a是一个不完整的类型,我知道当它具有指针的返回类型或对该对象的引用时,它工作得很好。
但是,当我定义一个返回类型为其类的方法时:
class B{
public:
B foo(){...}
}
它工作得很好。
我认为在类的定义中定义方法时,类仍然是一个不完整的类型。因此,我认为这会导致类似于前者的错误,但事实并非如此。有人知道为什么吗?
在这里寻求帮助之前,我已经找了很长时间了。)我不擅长英语,所以我的描述可能
假设代码如下:
#include <stdio.h>
int a(){
int b = 5;
return b;
}
int main ()
{
printf("%d\n", sizeof(a));
return 0;
}
上面打印的是1。那是什么意思?
我知道当在结构上使用sizeof时,它会获得其中数据类型的总大小(以字节为单位)。但是当它在函数上使用时,它意味着什么呢?
编辑:
如果我用sizeof(a()))而不是sizeof(a))怎么办?现在它打印的4是返回类型的大小,这是正确的方法吗?它怎么不是未定义的呢?