【发布时间】:2014-11-09 03:10:16
【问题描述】:
我已经检查了here 和here 的问题,但仍然无法找出问题所在。
这是调用代码:
#include "lib.h"
using namespace lib;
int
main(const int argc, const char *argv[])
{
return 0;
}
这是库代码:
#ifndef lib_h
#define lib_h
#include <string>
#include <vector>
#include <memory>
namespace lib
{
class Foo_impl;
class Foo
{
public:
Foo();
~Foo();
private:
Foo(const Foo&);
Foo& operator=(const Foo&);
std::unique_ptr<Foo_impl> m_impl = nullptr;
friend class Foo_impl;
};
} // namespace
#endif
clang++ 给了我这个错误:
“sizeof”对不完整类型“lib::Foo_impl”的无效应用
注意:在成员函数 'std::default_delete::operator()' 的实例化中请求
你可以看到我已经特别声明了 Foo 析构函数。我在这里还缺少什么?
【问题讨论】:
-
这似乎与NSDMI有关......
-
如果你改变 std::unique_ptr
m_impl = nullptr; 会发生什么到 std::unique_ptr m_impl?我认为它应该有效? -
我认为这里会出现类似的问题:coliru.stacked-crooked.com/a/984df6900bd1ba8b 该标准似乎对 NSDMI 是否必须有效,即使它被忽略也很模糊。
-
@dyp(即使你删除了 foo 的默认 ctor)
-
如果没有人很快给出一个体面的答案,我会发邮件给 std-discussion。编译器编写者似乎同意这种行为,但我找不到指定的位置或是否指定。
标签: c++ c++11 language-lawyer