3

MSVCからにプロジェクトを移植しBorland C++ていますが、 で問題が発生していtemplate functionsます。たとえば、次の

void fn(const char *buffer)
{
  vector<string> output;
  boost::split(output, string(buffer), is_any_of(","));
  // ...

コンパイラ エラーが発生します。

[BCC32 Error] example.cpp(208): E2285 Could not find a match for 'split<SequenceSequenceT,RangeT,PredicateT>(vector<string,allocator<string> >,string,is_any_ofF<char>)'

一方、変更された例

void fn(const char *buffer)
{
  vector<string> output;
  string sBuffer(buffer);
  boost::split(output, sBuffer, is_any_of(","));
  // ...

正常にコンパイルされます。

投稿のタイトルに示されているように、この問題の一般化は、BCC引数が関数の引数リスト内で構築される一時オブジェクトとして渡される場合、特定のケースではテンプレート関数と一致しないように見えることです。

BCC影響を受けるすべてのコードを変更する前に、最初の例が間違っていると考える理由を理解したいと思います。これはコンパイラの欠陥ですか、それとも私のコードはC++標準に準拠していませんか?

を使用してRAD Studio / C++ Builder XE2います。

4

2 に答える 2

3

関数がテンプレートだからではありません。これは、ここに記載されているように、何らかの理由でInput引数を非const 左辺値参照として受け取るためです。

template<typename SequenceSequenceT, typename RangeT, typename PredicateT> 
  SequenceSequenceT & 
  split(SequenceSequenceT & Result, RangeT & Input, PredicateT Pred, 
        token_compress_mode_type eCompress = token_compress_off);

標準のC++では、などの一時的な右辺値をそのような参照にバインドすることはできませんstring(buffer)。マイクロソフトの想像力に富んだ言語の再解釈では、それが可能です。

解決策は、あなたが行ったことを正確に実行することです。参照によって渡すことができる名前付きの非一時変数を導入します。

于 2012-09-25T12:34:35.993 に答える
3

ブーストの説明書より

template<typename SequenceSequenceT, typename RangeT, typename PredicateT> 
  SequenceSequenceT & 
  split(SequenceSequenceT & Result, RangeT & Input, PredicateT Pred, 
        token_compress_mode_type eCompress = token_compress_off);

関数は実際に参照によってパラメーターを取得するように見えるため、「回避策」は実際には正しい使用方法です。

MSVC は、「拡張機能」として非 const 参照へのバインディングを許可することが知られています。

于 2012-09-25T12:33:11.427 に答える