小编Jea*_*uys的帖子

c ++通过clang重载虚函数警告?

clang在编译以下代码时发出警告:

struct Base
{
    virtual void * get(char* e);
//    virtual void * get(char* e, int index);
};

struct Derived: public Base {
    virtual void * get(char* e, int index);
};
Run Code Online (Sandbox Code Playgroud)

警告是:

warning: 'Derived::get' hides overloaded virtual function [-Woverloaded-virtual]
Run Code Online (Sandbox Code Playgroud)

(当然需要启用上述警告).

我不明白为什么.请注意,在Base中取消注释相同的声明会关闭警告.我的理解是,由于两个get()函数具有不同的签名,因此不能隐藏.

clang对吗?为什么?

请注意,这是在MacOS X上,运行最新版本的Xcode.

clang --version
Apple LLVM version 5.0 (clang-500.1.74) (based on LLVM 3.3svn)
Run Code Online (Sandbox Code Playgroud)

更新:与Xcode 4.6.3相同的行为.

c++ virtual hidden warnings overloading

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

Core Data -existingObjectWithID:error:导致错误133000

我的应用程序使用核心数据(在Magical Record的帮助下)并使用相当多的多线程NSOperation.

当然,我非常小心,只能NSManagedObjectID在线程/操作之间传递.

现在,为了回到操作中相应的托管对象,我使用-existingObjectWithID:error::

Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error];
Run Code Online (Sandbox Code Playgroud)

但我得到的是零,并error说这是一个错误#13300 : NSManagedObjectReferentialIntegrityError.

以下是文档中有关此错误的内容:

NSManagedObjectReferentialIntegrityError
Error code to denote an attempt to fire a fault pointing to an object that does not exist.
The store is accessible, but the object corresponding to the fault cannot be found.
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这不是真的:该对象存在.实际上,如果我用a迭代遍历该Collection实体的所有实例NSFetchRequest,我会在其中找到它,它NSManagedObjectID就是我传递给它的那个实体-existingObjectWithID:error:.

而且,如果我使用-objectWithID:,我会得到一个正确的对象.

所以我有些东西不见了.以下是一些其他观察/问题:

  • "一个不存在的对象":那句话中"存在"的含义是什么?"存在"在哪里?那时它在我的Core Data商店中肯定"存在".
  • "无法找到与故障对应的对象":该句中"找到"的含义是什么?"发现"在哪里?在那时我肯定会在我的Core Data商店中找到它.

所以也许我错过了什么existingObjectWithID:error:呢?文件说:

If there is …
Run Code Online (Sandbox Code Playgroud)

cocoa core-data fault

40
推荐指数
2
解决办法
8849
查看次数

NSFileHandle fileHandleForWritingAtPath:返回null!

我的iPad应用程序有一个小的下载工具,我想使用NSFileHandle附加数据.问题是创建调用只返回空文件句柄.可能是什么问题呢?以下是应该创建我的文件句柄的三行代码:

NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; 
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
Run Code Online (Sandbox Code Playgroud)

我检查了文件路径,我没有看到任何错误.

TYIA

cocoa-touch nsfilehandle

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

tableView:在删除项目后使用nil indexPath调用cellForRowAtIndexPath

我有一个UITableView由a 管理的vanilla NSFetchedResultsController来显示给定Core Data实体的所有实例.

当用户通过滑动删除表视图中的条目时,tableView:cellForRowAtIndexPath:最终会UITableViewController使用a 调用nil indexPath.由于我没想到它会被调用nil indexPath,应用程序崩溃了.

我可以通过检查该nil值然后返回一个空单元来解决崩溃问题.这似乎有效,但我仍然担心我可能处理了一些错误.有任何想法吗?有没有人见过tableView:cellForRowAtIndexPath:nil indexPath

请注意,仅当用户通过滑动单元格从表视图中删除时才会发生这种情况.使用表格视图编辑模式删除项目时,不会发生.删除单元格的两种方法有什么不同?

那么nil indexPath在表视图中获取委托方法真的是一个好的情况吗?

我的视图控制器代码非常标准.这是删除:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
        [self.moc deleteObject:managedObject];
        NSError *error = NULL;
        Boolean success = [self.moc save:&error];
        if (!success) { <snip> }
        // actual row deletion from …
Run Code Online (Sandbox Code Playgroud)

null uitableview nsindexpath ios

15
推荐指数
1
解决办法
1974
查看次数

从内存缓冲区初始化C++ std :: istringstream?

我有一个内存块(不透明),我想通过他们的C++适配器存储在mySQL的Blob中.适配器需要一个istream:

virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何从这个内存块创建一个std :: istream(键入为char*).它不是一个字符串,因为它不是以空值终止的(但我知道它的长度当然).

如果没有复制我的内存块,例如在std :: string中,我找不到一种方法.我认为这有点浪费.这样的东西不起作用:

    std::streambuf istringbuf(blockPtr, blockLength);
    std::istringstream tmp_blob(&istringbuf);
Run Code Online (Sandbox Code Playgroud)

因为std :: streambuf没有这样的构造函数.我看到了以下建议.

    std:: istringstream       tmp_blob;
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

c++ streambuf

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

控制Xcode将包含哪个项目头文件

我的Xcode项目使用两个目标构建到同一产品的变体.两者之间的区别仅在于使用了哪个版本的库.对于.c源文件,使用目标复选框可以很容易地将正确的版本分配给正确的目标.但是,包括头文件始终包含相同的头文件.这对于一个目标是正确的,但对另一个目标则是错误的.

有没有办法控制每个目标包含哪个头文件?

这是我的项目文件层次结构(在Xcode中复制):

MyProject
  TheirOldLib
    theirLib.h
    theirLib.cpp
  TheirNewLib
    theirLib.h
    theirLib.cpp
myCode.cpp
Run Code Online (Sandbox Code Playgroud)

和myCode.cpp做的事情如下:

#include "theirLib.h"
…
somecode()
{
#if OLDVERSION
  theirOldLibCall(…);
#else
  theirNewLibCall(…);
#endif
}
Run Code Online (Sandbox Code Playgroud)

当然,我OLDVERSION为一个目标而不是另一个目标定义.

注意#include必须如图所示.以下两个都失败,找不到文件错误:

#include "TheirOldLib/theirLib.h"
#include "TheirNewLib/theirLib.h"
Run Code Online (Sandbox Code Playgroud)

那么有没有办法告诉Xcode哪个theirLib.h包含每个目标?

约束:
- 两个头文件具有相同的名称.作为最后的手段,我可​​以重命名其中一个,但我宁愿避免这样做,因为这将导致其他平台上的主要头发.
- 必须更改#include添加对封闭文件夹的引用也是我宁愿避免的,因为我需要使用条件编译指令执行两次.
- 我可以自由地调整我的项目,因为我认为合适

谢谢你的帮助.

xcode include search-path

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

如何使用C++ 11 <atomic>实现指向整数的指针的原子增量?

在将一些Windows C++代码移植到iOS时,我需要提供Win32 long InterlockedIncrement(long *p)调用的实现.使用中定义的函数很容易<libkern/OSAtomic.h>.

但是,我想知道是否可以仅使用C++ 11工具以与操作系统无关的方式编写它<atomic>.我想出了这个,我不确定能达到我想要的:

inline long InterlockedIncrement(long* p)
{
    std::atomic<long&> atomicP(*p);
    return ++atomicP;
}
Run Code Online (Sandbox Code Playgroud)

这有用吗?这够好吗?这两行不是原子的,但增量应该是原子的,这是关键.

<atomic>我发现的所有使用示例都不同,其中a std::atomic<T>是直接定义和使用的.在这里,我想使用一个现有的长变量,调用者通过地址传递给我.我找不到这样的例子.

编辑:Clang 3.2(在Xcode 4.x中)无法编译++atomicP,错误"无法增加类型的值std::atomic<long&>"(也没有atomicP += 1).

什么是正确的方法?

再次编辑:指针实现编译...

inline long InterlockedIncrement(long* p)
{
    std::atomic<long*> atomicP(p);
    return ++(*atomicP);
}
Run Code Online (Sandbox Code Playgroud)

但是我担心这不起作用,因为我不增加原子类型,而是指针指向的值,这不是原子的.

c++ atomic c++11

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

为什么iconv可以转换预组合形式而不是"É"的分解形式(从UTF-8到CP1252)

我使用iconv库来连接从使用UTF-8的现代输入源到使用Latin1的遗留系统,即CP1252(ISO-8859-1的超集).

界面最近未能转换法语字符串"Éducation",其中"É"编码为十六进制45 CC 81.请注意,目标编码的确具有"É"字符,编码为C9.

为什么iconv无法转换为"É"?我检查过MacOS X 10.7.3提供的iconv命令行工具说它无法转换,并且PERL iconv模块也失败了.

令人费解的是,"É"字符(编码为C3 89)的预组合形式转换得很好.

这是iconv的错误还是我错过了什么?

请注意,如果我尝试从UTF-16转换(其中"É"编码为00 C9组合或00 45 03 01分解),我也会遇到同样的问题.

unicode iconv

9
推荐指数
1
解决办法
2218
查看次数

链接器错误:想要C++虚拟基类析构函数

我有一个链接错误,其中链接器抱怨我的具体类的析构函数正在调用其抽象的超类析构函数,其代码缺失.

这是在XCode的Mac OS X上使用GCC 4.2.

我看到了g ++未定义的对typeinfo的引用,但它并不完全相同.

这是链接器错误消息:

Undefined symbols:
  "ConnectionPool::~ConnectionPool()", referenced from:
      AlwaysConnectedConnectionZPool::~AlwaysConnectedConnectionZPool()in RKConnector.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

这是抽象基类声明:

class ConnectionPool {
public:
    static ConnectionPool* newPool(std::string h, short p, std::string u, std::string pw, std::string b);   
    virtual ~ConnectionPool() =0;
    virtual int keepAlive() =0;
    virtual int disconnect() =0;
    virtual sql::Connection * getConnection(char *compression_scheme = NULL) =0;
    virtual void releaseConnection(sql::Connection * theConnection) =0;
};
Run Code Online (Sandbox Code Playgroud)

这是具体的类声明:

class AlwaysConnectedConnectionZPool: public ConnectionPool {
protected:
    <snip data members> …
Run Code Online (Sandbox Code Playgroud)

c++ gcc abstract-class linker-errors

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

跨平台宏用于静默未使用的变量警告

在将大量C++代码从Visual Studio(2008)移植到Xcode(4.4+)时,我会遇到如下行:

UNUSED_ALWAYS(someVar);
Run Code Online (Sandbox Code Playgroud)

UNUSED_ALWAYS(x)(通过UNUSED(x))宏扩展到x这似乎沉默的Visual C++就好了.但这对Clang来说还不够.

对于Clang,我通常使用该#pragma unused x指令.

UNUSED_ALWAYSUNUSED宏在人工定义windows.h这是我控制包含了一些工具来帮助的Xcode编译的Windows的东西头.

有没有办法定义UNUSED(x)扩展到#pragma unused x?我试过这个,Clang没有接受:

#define UNUSED(x) #pragma unused(x)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

#define UNUSED(x) (void)(x)
Run Code Online (Sandbox Code Playgroud)

这似乎有效.我错过了什么吗?

c++ xcode clang suppress-warnings visual-c++

8
推荐指数
2
解决办法
6127
查看次数