【发布时间】:2012-07-07 21:09:06
【问题描述】:
举个简单的例子。如果我在没有 ARC 的情况下编译以下 main.mm 文件,它可以正常工作。
#import <Foundation/Foundation.h>
template <typename T>
int testing(const T & whoCares) {
return 0;
}
int main(int argc, const char * argv[])
{
return testing(@"hello");
}
如果我用 ARC 编译它,会出现以下错误:
/Users/sam/Projects/TemplateTest/TemplateTest/main.mm:10:12: error: no matching function for call to 'testing'
return testing(@"hello");
^~~~~~~
/Users/sam/Projects/TemplateTest/TemplateTest/main.mm:4:5: note: candidate template ignored: substitution failure [with T = NSString *]
int testing(const T & whoCares) {
^
1 error generated.
为什么?更重要的是,它可以解决吗?对于替换失败的原因,没有任何进一步的解释。如果我显式传递类型,如下所示:
return testing<NSString *>(@"hello");
它有效。话虽如此,我不想也不应该在我的代码中这样做。
同样有趣的是,这只对 Objective C 类型失败。无论是否启用 ARC,以下替换都可以正常工作:
return testing("hello");
return testing(123);
【问题讨论】:
-
您是否可以选择在您的 Xcode 版本中切换编译器,如果可以,是否会有所不同?
-
我愿意(我使用的是 Xcode 4.3.3)。但是,我的印象是 ARC 仅适用于 Apple LLVM Compiler 3.1 设置(这是我正在使用的)。
-
您的示例适用于 Clang 3.2 版。我怀疑@SamCee 的回答是正确的,并且该错误已经修复。
-
@Quuxplusone 是的,你是对的。 Apple 发布 XCode 4.5 时已修复此问题
标签: c++ objective-c automatic-ref-counting clang