C++11 std::元组的std::vector导致未知大小

C++11 std::元组的std::vector导致未知大小,c++11,vector,visual-studio-2013,tuples,C++11,Vector,Visual Studio 2013,Tuples,我想在std::vector中存储三个任意整数,而不定义结构/类。所以我选择了std::tuple: std::vectorc:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(1628):错误C2036:'std::tuple*':未知大小 1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(1622):编译类模板成员函数“

我想在std::vector中存储三个任意整数,而不定义结构/类。所以我选择了std::tuple:

std::vectorc:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(1628):错误C2036:'std::tuple*':未知大小
1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(1622):编译类模板成员函数“void std::vector::_Tidy(void)”时
1> 与
1>          [
1> _Ty=std::tuple
1>          ]
1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(945):请参阅正在编译的函数模板实例化“void std::vector::_Tidy(void)”的参考
1> 与
1>          [
1> _Ty=std::tuple
1>          ]
1> d:\projects\gl33\src\nvf.cpp(39):请参阅正在编译的类模板实例化“std::vector”的参考
1> 与
1>          [
1> _Ty=std::tuple
1>          ]
======生成:0成功,1失败,0最新,0跳过=======
这是因为MSVS2013编译器的限制吗?还是我做错了什么?

一个类类型是已知的(它的名称是已知的),但如果该类型只被前向声明,而没有定义,那么它的大小是未知的。例如

struct X;

sizeof(X) // error: X is incomplete
类型的大小对于指针算法很重要,这是查看编译器错误时的另一个提示(其中提到指向
元组的指针)

MSDN提供了:

其中
struct A*pa
隐式向前声明
struct A


当您自己没有包含所有必需的头时,标准库的头可能会出现这种情况。标准库中的类型之间存在相互依赖关系。如果标准库头只需要向前声明
tuple
,它将不包括重量级
tuple
头本身,以减少编译时间

我可以通过只包含
而不包含
来重现OP中的问题。解决方案:手动包括您需要的所有类型的标题-使用
vector
时,包括
(以及
)。通常,包含一个标头可以保证某一组类型的可用性。为了最大限度地提高可移植性,请始终确保包含的头文件保证可以使用程序(*)中的所有类型


(*)更具体地说,您应该确保您的程序需要定义的所有类型都有定义。标准库容器要求它们的值类型是完整的(至少在类模板实例化时)。因此,如果您的程序需要定义
向量
,它也需要定义
元组

我想您忘了包含
标题:
#include
-我可以在只包含
而不包含
时重现错误消息。该死,您说得对。只是觉得已经包括在内了。谢谢你的评论。你能转载一个我可以标记为已解决的答案吗?谢谢你对这个主题的详细阐述!
>c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(1628): error C2036: 'std::tuple<unsigned int,unsigned int,unsigned int> *' : unknown size
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(1622) : while compiling class template member function 'void std::vector<std::tuple<unsigned int,unsigned int,unsigned int>,std::allocator<_Ty>>::_Tidy(void)'
1>          with
1>          [
1>              _Ty=std::tuple<unsigned int,unsigned int,unsigned int>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(945) : see reference to function template instantiation 'void std::vector<std::tuple<unsigned int,unsigned int,unsigned int>,std::allocator<_Ty>>::_Tidy(void)' being compiled
1>          with
1>          [
1>              _Ty=std::tuple<unsigned int,unsigned int,unsigned int>
1>          ]
1>          d:\projects\gl33\src\nvf.cpp(39) : see reference to class template instantiation 'std::vector<std::tuple<unsigned int,unsigned int,unsigned int>,std::allocator<_Ty>>' being compiled
1>          with
1>          [
1>              _Ty=std::tuple<unsigned int,unsigned int,unsigned int>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped =======
struct X;

sizeof(X) // error: X is incomplete
struct A* pA;
int main() {
   pA++;   // C2036, size of A not known
   ((char*&)pA)++;   // OK, if sizeof(A) == sizeof(char)
}