STLportのvectorでpush_backするとC2668エラー(解決できない)が出て困っています。回避するには?


山田  2005-06-29 03:41:25  No: 58097

STLport導入中です。
(iostream、allocatorはVC付属のものを使用)

サンプルプログラムをためしにコンパイルして実行してみることにしました。
以下がそのサンプルです。

#include <stdlib.h>
#include <tchar.h>
#include <string>
#include <vector>
int _tmain()
{
  int inttest(10);
  std::vector< int > v_int;
  v_int.push_back( inttest );
  return EXIT_SUCCESS;
}
このサンプルは、
エラー無し警告無しで、コンパイル、実行できました。
しかし、
#include <stdlib.h>
#include <tchar.h>
#include <string>
#include <vector>
int _tmain()
{
  std::string stringtest("Test");
  std::vector< std::string > v_string;
  v_string.push_back( stringtest );
}
このプログラムでは、コンパイルエラーが出ました。
エラーメッセージ
>C:\STLport-4.6.2\stlport\stl\_vector.h(333) : error C2668: 'std::_Construct' : オーバーロード関数の呼び出しを解決することができません。
>C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xmemory(40): 'void std::_Construct<_Tp,_Tp>(_T1 *,const _T2 &)' である可能性があります。

STLportの_vector.hでは、
>(略)
> void push_back(const _Tp& __x) {
>   if (this->_M_finish != this->_M_end_of_storage._M_data) {
>     _Construct(this->_M_finish, __x);
>     ++this->_M_finish;
>   }
>(略)
STLportの_construct.hでは
>(略)
>template <class _T1, class _T2>
>inline void _Construct(_T1* __p, const _T2& __val) {
># ifdef _STLP_DEBUG_UNINITIALIZED
>  memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
># endif
>    _STLP_PLACEMENT_NEW (__p) _T1(__val);
>}
>(略)
VCのxmemoryでは、
>(略)
>template<class _T1,
>  class _T2> inline
>  void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
>  {  // construct object at _Ptr with value _Val
>    new ((void _FARQ *)_Ptr) _T1(_Val);
>  }
>
>(略)
となっており、確かに、
同じ関数名になっています。
同じ関数名だから解決できない、というのはよくわかるのですが、
衝突しないようにするにはどうすればいいのでしょうか。
STLportのドキュメントを一通り読んだのですがわかりませんでした。

STLportのallocatorを使用しないのがまずいのかと思って
設定を外したのですが
#  STLport-4.6.2\stlport\stl\_site_config.h の
#  #define _STLP_USE_NEWALLOC 1
#  このコメント復活させる
同じエラーが出ました。(しっかりメモリリークするようになりました。)

何かヒントになりそうなことだけでも
よろしくお願いします。


tetrapod  2005-06-29 20:48:19  No: 58098

VC++6SP6 および Visual C++ Toolkit 2003 cl.exe + VC++6SP6 header の組み合わせで
試してみたところどちらもコンパイルエラーにはならなかったです。
何故ならないか、ですがどうやら #include <xmemory> されていないから、らしい。

っつーか本来 STLport 配下で <xmemory> が使われること自体がおかしい。
誰が #include <xmemory> しているか、調べましょう。


山田  2005-06-30 01:27:31  No: 58099

tetrapodさんご指摘ありがとうございました。
私の環境は、VC7.1です。
#include <xmemory>について調べてみました。
すると、VC付属のiostreamを使用しているのが原因っぽかったので、
STLport-4.6.2\stlport\stl_user_config.h の
#define   _STLP_NO_OWN_IOSTREAMS 1
を、もとどおりコメントアウトして、
VC付属のiostreamを使用せず、
STLportのiostreamを使用するようにしました。
STLportのiostreamソースをビルドして、ライブラリをつくり、
上記サンプルをビルドしなおしたところ、
コンパイルエラーは出なくなりました。
(リンク警告は出ましたがこれはまた別の問題なので)

やはり、iostream関係からxmemoryがincludeされていたようです。

STLportのiostreamを使用しない場合、
STLport-4.6.2\stlport\stl_user_config.h の
#define   _STLP_NO_OWN_IOSTREAMS 1
を、コメントアウトするだけではだめなのかもしれません。

もう少し調べてみます。


山田  2005-06-30 03:12:52  No: 58100

申し訳ありません。
STLportのforumをみていたら同じ問題について書かれていました。
http://www.stlport.com/dcforum/DCForumID7/2327.html

>No the solution is somthing like "use an other STLport version". Take RC2 from download page or better RC3 from Announcement forum or better STLPORT_5_0 branch from CVS.

ダウンロードページから、5.0 RC2をダウンロードするか、Announcement forumから、5.0 RC3をダウンロードするか、CVSで取ってくるか、つまり、別のバージョンを取ってこないとだめみたいです。

とりあえず、5.0 RC3を試してみようと思います。
http://www.stlport.com/dcforum/DCForumID4/145.html


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加