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では、何でもに渡すことができ、idそれを忘れることができます。簡単に言えば、コンパイルする場合でも、コンパイルするべきではなく、C++とObjective-Cに依存してうまく混合することはできません。Objective-C ++は強力な組み合わせかもしれませんが、互いに完璧に機能することはめったにないことを忘れないでください。

于 2012-07-07T21:27:03.550 に答える