【发布时间】:2016-01-17 17:54:54
【问题描述】:
我有一个像下面这样的头文件-
// abc.hpp
#include <vector>
#include <string>
namespace A
{
namespace B
{
struct abc
{
std::string _type;
};
using abc_vector = std::vector<abc>;
}
}
我在另一个头文件中使用前向声明。
// con.hpp
#include <vector>
namespace A
{
namespace B
{
struct abc; // Forward Declaration
using abc_vector = std::vector<abc>;
}
namespace C
{
class N
{
public:
B::abc_vector foo(std::string type);
};
}
}
真正让我感到困惑的是我的代码可以编译和工作。
如何允许向量声明为不完整类型? 我认为它不应该能够决定 abc 的大小。
using abc_vector = std::vector<abc>;
下面是我用来测试头文件的代码。 很奇怪,它可以编译并且运行良好。
#include "con.hpp"
#include "abc.hpp"
#include <iostream>
namespace A
{
namespace C
{
B::abc_vector N::foo(std::string type)
{
B::abc a;
a._type = type;
B::abc_vector d;
d.push_back(a);
return d;
}
}
}
int main()
{
A::C::N n;
auto container = n.foo("test");
for (const auto& i : container)
std::cout << i._type << ' ';
return 0;
}
【问题讨论】:
-
“我认为它不应该能够决定 abc 的大小。” 是什么让你认为它需要?
-
我认为这行得通,因为类型是您在函数中使用它时定义的。
-
我在这里的答案中读到了它 - [link] (stackoverflow.com/questions/37346/…) 编译器需要知道“B”有多大才能生成适当的布局信息。
-
@badola 提示:
std::vector<T>的大小与T的大小和向量中的元素数量无关。
标签: c++