在Objective-C程序中遇到枚举可见性问题。 我有两个头文件,一个定义了一个typedef enum 。 另一个文件需要使用typedeftypes。 在直接的C中,我只是简单地包含另一个头文件,但是在Objective-C中,build议不要在头文件之间使用#import ,而@class根据需要使用forward @class声明。 但是,我无法弄清楚如何转发 – 声明一个枚举types。 我不需要实际的枚举值,除了在相应的.m实现文件中,我可以安全地#import了。 那么我怎样才能得到在头文件中识别typedef enum ?
自从海湾合作委员会抓到了这件事以来已经有一段时间了,但今天才发生。 但我从来没有理解为什么GCC需要在模板内使用typedef typename,而VS和我想ICC不这样做。 typedef typename是一个“错误”还是一个过于严格的标准,还是一些编译器的作者? 对于那些不知道我的意思的人来说是一个例子: template<typename KEY, typename VALUE> bool find(const std::map<KEY,VALUE>& container, const KEY& key) { std::map<KEY,VALUE>::const_iterator iter = container.find(key); return iter!=container.end(); } 上面的代码编译在VS(可能在ICC中),但在GCC失败,因为它需要这样的: template<typename KEY, typename VALUE> bool find(const std::map<KEY,VALUE>& container, const KEY& key) { typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename iterator iter = container.find(key); return iter!=container.end(); } 注:这不是我正在使用的实际function,但只是愚蠢的东西,说明问题。
我偶然发现了typedef关键字在types和别名之间的代码 int typedef INT; 它在gcc和clang中编译( 现场示例 )。 我对标准的理解不是很好。 所以我的问题是:这个标准是一致的吗? 我可以依靠编译器来支持它吗?
我已经看到了很多关于这个问题的问题,但是我会以不同的方式提出问题。 是否有一种方法容易确定是什么导致types不完整? 在我的情况下,我正在使用别人的代码,我完全相信我没有正确的标题,但(因为电脑做这个东西比人眼更快,更好)有没有办法让编译器说,“嘿,你认为你在第34行input了X,但实际上是缺less的 。 错误本身只在您分配时显示,这不是很有帮助。
根据cppreference.com size_t是在几个头文件中定义的,即 <cstddef> <cstdio> <cstring> <ctime> 而且,自从C ++ 11以后, <cstdlib> <cwchar> 首先我想知道为什么是这样。 这与DRY原则不矛盾吗? 不过,我的问题是: 我应该包含哪一个上面的头文件来使用size_t ? 这有什么关系吗?
如果我需要Swift中的自定义types,那么我可以inputtypedef ,我该怎么做呢? (类似于一个闭包语法typedef)
我在一个项目中广泛地使用了shared_ptr和STL,这导致了过长的,容易出错的types,比如shared_ptr< vector< shared_ptr<const Foo> > > (我是一个ObjC程序员,是相当普遍的,而且这样做太多了。)我相信,要一致地调用这个FooListPtr并logging命名约定“Ptr”意思是shared_ptr,而“List”意思是shared_ptr的向量。 这很容易typedef,但它引起头痛头。 我似乎有几个选项来定义FooListPtr : Foo.h. 这纠缠所有标题和创build严重的构build问题,所以这是一个不起动。 FooFwd.h(“forward header”)。 基于iosfwd.h,这就是Effective C ++所build议的。 这是非常一致的,但维护两倍的标题数量的开销看起来很烦人。 Common.h(将所有这些文件放在一个文件中)。 这通过缠绕许多不相关的types来杀死可重用性。 您现在不能只拾取一个对象并将其移动到另一个项目。 这是一个不起眼的人。 如果还没有被typedefed的话,某种特殊的#define魔法。 我有一个持久的不喜欢的预处理器,因为我认为这使得新手难以挖掘的代码,但也许…. 使用vector子类而不是typedef。 这似乎很危险 这里有最佳做法吗? 它们如何以真实的代码出现,重用性,可读性和一致性是至关重要的? 我已经标记了这个社区维基,如果别人想要添加更多的讨论选项。
我想在我的项目中使用一个子类的typedef,我在下面的例子中隔离了我的问题。 有谁知道我要去哪里错了? template<typename Subclass> class A { public: //Why doesn't it like this? void action(typename Subclass::mytype var) { (static_cast<Subclass*>(this))->do_action(var); } }; class B : public A<B> { public: typedef int mytype; B() {} void do_action(mytype var) { // Do stuff } }; int main(int argc, char** argv) { B myInstance; return 0; } 这是我得到的输出: sean@SEAN-PC:~/Documents/LucadeStudios/experiments$ […]
在C ++中,下面的代码给出了一个编译器错误: void destruct1 (int * item) { item->~int(); } 这个代码几乎是一样的,我只是键入int到另一个types,并发生了一些奇迹: typedef int myint; void destruct2 (myint * item) { item->~myint(); } 为什么第二个代码有效? 一个int得到一个析构函数是因为它已被typedefed? 如果你想知道为什么有人想这样做:这是来自重构C ++代码。 我们正在删除标准堆,并用自制池replace它。 这要求我们调用placement-new和析构函数。 我知道为基元types调用析构函数是没用的,但是我们希望它们在代码中,以防我们用实际的类来replacePOD。 发现赤裸裸的int不工作,但typedefed的做是一个惊喜。 顺便说一句 – 我有一个涉及模板function的解决scheme。 我们只需在模板中inputdef,一切都很好。
我遇到了C ++中关键字typedef的新用法。 这个typedef语句是什么意思? int typedef foo;