相关疑难解决方法(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万
查看次数

如何在Qt中维护小部件的宽高比?

如何在Qt中维护窗口小部件的宽高比以及如何使窗口小部件居中呢?

user-interface qt widget aspect-ratio

32
推荐指数
4
解决办法
3万
查看次数

Clang -Wweak-vtables和纯抽象类

关于此主题的先前问题:

这是我最近提出的问题的后续跟进: clang:没有外线虚拟方法定义(纯抽象C++类) ,并且被标记为此问题的副本:clang的-Wweak-含义是什么?虚函数表?.我不认为那回答了我的问题,所以在这里我专注于困扰我的事情,但尚未得到回答.

我的情景:

我正在尝试使用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 -Wweak-vtables -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)

当A类不是纯抽象时,上面的代码构建得很好.以下代码不会发出警告,唯一的变化是A类不再是抽象的:

test2.h:

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

test2.cc

#include "test2.h"

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

我的问题

上面的代码在Clang中触发警告的纯抽象类有什么特别之处?

c++ abstract-class clang llvm-clang clang++

8
推荐指数
1
解决办法
3103
查看次数

为什么clang会为具有异常虚拟方法的类提供弱vtable警告?

Object.hpp:

class Object
{  
public:
    virtual ~Object();
};
Run Code Online (Sandbox Code Playgroud)

Object.cpp:

#include "Object.hpp"

Object::~Object()
{
}
Run Code Online (Sandbox Code Playgroud)

我们来编译它:

>clang++ -v
clang version 3.9.0 (branches/release_39)
Target: x86_64-pc-windows-msvc
Thread model: posix

>clang++ -Weverything -c Object.cpp
In file included from Object.cpp:1:
./Object.hpp:1:7: warning: 'Object' has no out-of-line virtual method definitions;
its vtable will be emitted in every translation unit [-Wweak-vtables]
class Object
      ^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)

但是Object确实有一个外联的虚拟方法,为什么Clang会产生这个警告呢?

c++ clang

6
推荐指数
0
解决办法
344
查看次数

在C ++中声明“接口”,并且不将其vtable传递给每个翻译单元

根据答案,在C ++中从概念上类似于接口的方式声明类的方法如下:

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

但是,当我这样做时,会收到警告:'IDemo' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit。是否有适当的方法在项目中使用此类接口而不用这些vtable污染每个翻译单元?

c++ inheritance abstract-class interface pure-virtual

3
推荐指数
1
解决办法
61
查看次数