我是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) 我刚刚专门std::hash针对用户定义的类型使用:
template<>
struct hash<...> {...};
Run Code Online (Sandbox Code Playgroud)
当VC10向我发出警告时:
警告C4099:'std :: hash <_Kty>':使用'struct'时首先看到使用'class'看到的类型名称
我发现它的标准库声明std::hash为class,而标准(或我最新的自由草案)声明为struct.
好吧,当然我知道结构与类没有任何不同(除了不同的默认访问和继承类型).但我的问题是:
structs 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)
没有编译器警告,结果程序似乎工作正常.这让我很好奇:理论上,这会不会引起问题?它只是一个指针,是的,但是,例如,如果类有虚方法,多继承,指针可能不同吗?
我知道关于默认公共/私有的类/结构之间的区别,但我特别询问前向声明和交换它们的可能后果.
这个警告有什么值得担心的吗?我读过它可能导致不稳定的行为?
这是我正在尝试编译的一个例子,有人可以向我解释为什么作者将对象声明为一个类但是然后将typedef表示为一个结构?如果课程是POD,这样做是否完全正常?
谢谢.
我想获得GCC产生的警告时,发现已被宣布与这两个名字是VisualStudio的生产class和struct.(警告4099)这通常来自前向声明,例如:
struct Base;
...
class Base { ... };
Run Code Online (Sandbox Code Playgroud)
VS在这种情况下实际上无法链接,因此我已将警告提升为错误.由于这个项目是跨平台的,我想在使用GCC编译时也发现这个问题 - 否则我可能会意外地检查在VS中不起作用的代码.
是否有任何开关或方法让GCC也拒绝或警告这样的类/结构声明不匹配?
注意:从评论中不确定此警告是否合法.对于我的问题它是不相关的,因为条件导致VisualStudio中的链接失败(我不能忽略警告).因此,我只想使用GCC识别问题,以便我的Windows编译不会突然停止工作.
答案:似乎没有解决方案.
我有以下代码(涉及多个文件)...
//--- 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用作模板参数这一事实与它有关。
感谢您的帮助。
我正在使用早期版本的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 …