相关疑难解决方法(0)

clang's -Wweak-vtables是什么意思?

我基本上不懂clang的-Wweak-vtables.这是我到目前为止所观察到的:

案例一:(触发警告)

class A {
    public:
    virtual ~A(){}        
};

class B : public A {
    public:
    virtual ~B(){}
};

int main(){}
Run Code Online (Sandbox Code Playgroud)

案例二:(不触发警告)

class A {
    public:
    virtual ~A(){}        
};   

int main(){}
Run Code Online (Sandbox Code Playgroud)

案例三:(不触发警告)

class A {
    public:
    virtual ~A();

};

A::~A(){}

class B : public A {
    public:
    virtual ~B(){}
};

int main(){}
Run Code Online (Sandbox Code Playgroud)

案例四:(触发警告)

class A {
    public:
    virtual ~A(){}
    virtual void fun(){}        
};    

class B : public A {
    public:
    virtual ~B(){}
};

int …
Run Code Online (Sandbox Code Playgroud)

c++ clang

71
推荐指数
1
解决办法
2万
查看次数

clang:没有外联虚拟方法定义(纯抽象C++类)

我正在尝试使用Clang-3.5编译以下简单的C++代码:

test.h:

class A
{
  public:
    A();
    virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)

test.cc:

#include "test.h"

A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)

我用来编译它的命令(Linux,uname -r:3.16.0-4-amd64):

$clang-3.5 -Weverything -std=c++11 -c test.cc
Run Code Online (Sandbox Code Playgroud)

而我得到的错误:

./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Run Code Online (Sandbox Code Playgroud)

任何暗示为什么会发出警告?虚拟析构函数根本没有内联.恰恰相反,test.cc中提供了一个外联定义.我在这里错过了什么?

编辑

我不认为这个问题是重复的: clang的-Wweak-vtables是什么意思? 正如FilipRoséen所说.在我的问题中,我特别提到纯抽象类(在建议的副本中没有提到).我知道如何-Wweak-vtables使用非抽象类,我很好.在我的例子中,我在实现文件中定义了析构函数(它是纯抽象的).这应该可以防止Clang发出任何错误,即使是-Wweak-vtables.

c++ clang llvm-clang clang++

34
推荐指数
3
解决办法
2万
查看次数

标签 统计

c++ ×2

clang ×2

clang++ ×1

llvm-clang ×1