4

举一个简单的例子。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);
4

2 回答 2

2

不幸的是,看起来这可能是一个带有 clang 的编译器错误。

请参阅: http: //lists.apple.com/archives/objc-language/2012/Feb/msg00078.html

于 2012-07-07T22:23:31.757 回答
0

除非我错过了 Objective-C++ 和 C++ 之间的根本区别,否则您总是传递模板的类型。编译器不会尝试在这方面变得聪明。您必须声明类型。在 GCC G++ 中,它失败并显示以下消息:

hello.cpp: In function ‘int main()’:
hello.cpp:7: error: ‘t’ was not declared in this scope

模板不应该像那样聪明。您必须记住,C++ 是静态类型的,并且类型推断非常有限。在 Objective-C 中,您可以将任何内容传递给 anid并忘记它。长话短说,即使它确实可以编译,也不应该,也不应该依赖 C++ 和 Objective-C 来很好地混合。Objective-C++ 可能是一个强大的组合,但请记住,它们很少能完美地协同工作。

于 2012-07-07T21:27:03.550 回答