相关疑难解决方法(0)

什么时候应该在C++中使用类vs结构?

在什么情况下在C++中使用structvs a 更好class

c++ oop struct ooad class

895
推荐指数
15
解决办法
38万
查看次数

typedef struct vs struct definitions

我是C编程的初学者,但我想知道typedef在定义结构时使用与使用结构之间有什么区别typedef.在我看来,实际上没有区别,他们实现了同样的目标.

struct myStruct{
    int one;
    int two;
};
Run Code Online (Sandbox Code Playgroud)

typedef struct{
    int one;
    int two;
}myStruct;
Run Code Online (Sandbox Code Playgroud)

c struct typedef

763
推荐指数
10
解决办法
66万
查看次数

将模板类专门化为结构

我刚刚专门std::hash针对用户定义的类型使用:

template<>
struct hash<...> {...};
Run Code Online (Sandbox Code Playgroud)

当VC10向我发出警告时:

警告C4099:'std :: hash <_Kty>':使用'struct'时首先看到使用'class'看到的类型名称

我发现它的标准库声明std::hashclass,而标准(或我最新的自由草案)声明为struct.

好吧,当然我知道结构与类没有任何不同(除了不同的默认访问和继承类型).但我的问题是:

  1. VC10是否违反此标准,或者是否可以在任何标准库组件中自由交换structs class(当然,只要成员所需的访问类型保持一致)?
  2. 将模板类专门化为结构是否合法,反之亦然,或者这会带来名称解析等问题(至少VC10认为值得警告).

c++ struct class template-specialization

17
推荐指数
1
解决办法
1064
查看次数

将声明转发为struct vs class

我在类的C++前向声明中发现了一个错误,它被错误地声明为struct Book而不是class Book.我认为Book曾经是一个结构,变成了一个类,但前向声明仍然存在.

Book.h:

class Book {
    ...
};
Run Code Online (Sandbox Code Playgroud)

Library.h:

struct Book;

class Library {
    std::vector<Book*> books;
};
Run Code Online (Sandbox Code Playgroud)

没有编译器警告,结果程序似乎工作正常.这让我很好奇:理论上,这会不会引起问题?它只是一个指针,是的,但是,例如,如果类有虚方法,多继承,指针可能不同吗?

我知道关于默认公共/私有的类/结构之间的区别,但我特别询问前向声明和交换它们的可能后果.

c++ struct forward-declaration

16
推荐指数
1
解决办法
5918
查看次数

警告C4099:使用'struct'时首次看到使用'class'的类型名称(MS VS 2k8)

这个警告有什么值得担心的吗?我读过它可能导致不稳定的行为?

这是我正在尝试编译的一个例子,有人可以向我解释为什么作者将对象声明为一个类但是然后将typedef表示为一个结构?如果课程是POD,这样做是否完全正常?

谢谢.

c++ compiler-warnings

15
推荐指数
2
解决办法
7751
查看次数

GCC可以产生像VS这样的结构/类名称不匹配吗?

我想获得GCC产生的警告时,发现已被宣布与这两个名字是VisualStudio的生产classstruct.(警告4099)这通常来自前向声明,例如:

struct Base;
...
class Base { ... };
Run Code Online (Sandbox Code Playgroud)

VS在这种情况下实际上无法链接,因此我已将警告提升为错误.由于这个项目是跨平台的,我想在使用GCC编译时也发现这个问题 - 否则我可能会意外地检查在VS中不起作用的代码.

是否有任何开关或方法让GCC也拒绝或警告这样的类/结构声明不匹配?

注意:从评论中不确定此警告是否合法.对于我的问题它是不相关的,因为条件导致VisualStudio中的链接失败(我不能忽略警告).因此,我只想使用GCC识别问题,以便我的Windows编译不会突然停止工作.


答案:似乎没有解决方案.

c++ gcc visual-studio

7
推荐指数
2
解决办法
1122
查看次数

向前将结构声明为类时出现Visual C ++ 2015链接器错误

我有以下代码(涉及多个文件)...

//--- SomeInterface.h
struct SomeInterface
{
  virtual void foo() = 0;
  virtual ~SomeInterface(){}
};

//--- SomeInterfaceUser.h
#include <memory> //shared_ptr

class SomeInterface;
//NOTE: struct SomeInterface... causes linker error to go away...

class SomeInterfaceUser
{
  public:
    explicit SomeInterfaceUser(std::shared_ptr<SomeInterface> s);
};

//SomeInterfaceUser.cpp
#include "SomeInterfaceUser.h"
#include "SomeInterface.h"
SomeInterfaceUser::SomeInterfaceUser(std::shared_ptr<SomeInterface> s)
{
}

//SomerInterfaceUserInstantiator.cpp
#include "SomeInterfaceUser.h"
#include "SomeInterfaceImpl.h"

struct SomeInterfaceImpl : SomeInterface
{
  virtual void foo(){}
};

void test()
{
  SomeInterfaceUser x{std::make_shared<SomeInterfaceImpl>()};
}
Run Code Online (Sandbox Code Playgroud)

使用Visual C ++编译器,我得到一个链接器错误(LNK2019)。使用GCC 4.8.4并非如此。将前向声明类SomeInterface更改为struct SomeInterface可使链接器错误消失。我一直以为应该可以互换使用类/结构?SomeInterfaceUser的接口不应取决于SomeInterface是定义为类还是struct,不是吗?

这是Visual C ++错误吗?我找不到任何与此有关的东西。我怀疑将struct用作模板参数这一事实与它有关。

感谢您的帮助。

c++ visual-c++

6
推荐指数
1
解决办法
731
查看次数

VS 2013上的LNK2001(MSVC 18)但VS 2015上没有(MSVC 19)

我正在使用早期版本的Cocos2dx来编写游戏并使用VS 2013进行编译.请注意,我正在使用CMake和Qt Creator两种编译器版本.当Cocos2dx v3.12问世时,我决定在我的游戏中将lib升级到该版本并开始使用VS 2015.然后我开始收到此错误:

QCardManager.cpp.obj:-1:错误:LNK2001:未解析的外部符号"public:static class QCard*__cdecl QCard :: create(enum PLAYER,struct Question const*,enum CARD_TYPE,int const&)"(?create @ QCard @@ SAPAV1 @ W4PLAYER @@ PBUQuestion @@ W4CARD_TYPE @@ ABH @ Z)

当我使用VS 2013时,我没有得到那个错误.经过几个小时的调试后我发现了原因.

这是粗略的贬值QCard:

#include "2d/CCSprite.h"
#include "CommonVariables.h"

class RandomPostureSprite;
class Question;
namespace cocos2d
{
class Label;
}

enum class CARD_TYPE {
    QUESTION,
    OPTION
};

class QCard : public cocos2d::Sprite
{
public:
    static QCard *create(PLAYER player, const Question *question, CARD_TYPE type, const int &index);
}
Run Code Online (Sandbox Code Playgroud)

我在QCard.cpp文件中正确实现了该功能,并且该文件也正确地添加到了项目中.所以问题是class …

c++ visual-c++

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