Den*_*hie 6 c++ gcc llvm clang
我的代码中出现了链接器错误.我已经确定了下面的基本要点.
此代码为链接器提供错误"vtable for Foo",引自:Foo :: Foo()
class Foo {
public:
Foo();
virtual ~Foo() = default;
};
Foo::Foo() { }
Run Code Online (Sandbox Code Playgroud)
但是这段代码没有给出任何错误:
class Foo {
public:
Foo();
virtual ~Foo() { }
};
Foo::Foo() { }
Run Code Online (Sandbox Code Playgroud)
为什么?我认为这= default应该与那些空方括号基本上做同样的事情.
更新:我使用的是"Apple LLVM编译器4.1",它是Xcode 4.5.2的一部分.它可能是这个编译器中的错误吗?它可能适用于最新的GCC(Apple不再发售).有关编译器的讨论,请参阅下面的注释.
更新2:如下所述,更改行以virtual inline ~Foo() = default;消除此错误.这难道不是仅仅有是一个错误?看起来编译器在没有明确写出的情况下不识别内联函数inline.
它适用于 g++ 4.7.2。但我在 clang 3.1 上遇到了和你一样的问题。
我有3个文件。
Foo.h:
#ifndef FOO_H
#define FOO_H
class Foo {
public:
Foo();
virtual ~Foo() = default;
};
#endif // FOO_H
Run Code Online (Sandbox Code Playgroud)
Foo.cpp:
#include "Foo.h"
Foo::Foo() { }
Run Code Online (Sandbox Code Playgroud)
主要.cpp:
#include <iostream>
#include "Foo.h"
using namespace std;
int main()
{
Foo foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但如果是这样,它也适用于 clang:
Foo.cpp 为空。
主程序
#include <iostream>
#include "Foo.h"
using namespace std;
Foo::Foo() { }
int main()
{
Foo foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我猜 clang 在生成对象文件期间有错误。