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相同的行为.
我的应用程序使用核心数据(在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:,我会得到一个正确的对象.
所以我有些东西不见了.以下是一些其他观察/问题:
所以也许我错过了什么existingObjectWithID:error:呢?文件说:
If there is …Run Code Online (Sandbox Code Playgroud) 我的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
我有一个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) 我有一个内存块(不透明),我想通过他们的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)
这是正确的方法吗?
我的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添加对封闭文件夹的引用也是我宁愿避免的,因为我需要使用条件编译指令执行两次.
- 我可以自由地调整我的项目,因为我认为合适
谢谢你的帮助.
在将一些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)
但是我担心这不起作用,因为我不增加原子类型,而是指针指向的值,这不是原子的.
我使用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分解),我也会遇到同样的问题.
我有一个链接错误,其中链接器抱怨我的具体类的析构函数正在调用其抽象的超类析构函数,其代码缺失.
这是在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++代码从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_ALWAYS和UNUSED宏在人工定义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++ ×5
xcode ×2
atomic ×1
c++11 ×1
clang ×1
cocoa ×1
cocoa-touch ×1
core-data ×1
fault ×1
gcc ×1
hidden ×1
iconv ×1
include ×1
ios ×1
nsfilehandle ×1
nsindexpath ×1
null ×1
overloading ×1
search-path ×1
streambuf ×1
uitableview ×1
unicode ×1
virtual ×1
visual-c++ ×1
warnings ×1