如何使C模板适用于使用ARC的Objective C类型?

举一个小例子.如果我编译以下main.mm文件没有ARC,它工作正常.

#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);

最佳答案 不幸的是,看起来这可能是clang的编译器错误.

见:http://lists.apple.com/archives/objc-language/2012/Feb/msg00078.html

点赞