• ベストアンサー

cygwinとUnixのコンパイルの違い。

こんにちは。 UNIXのソースをWindows上でビルドできるようにしています。 Windows上では、cygwinのコンパイラを使用しています。 下記コードがコンパイルが通らず悩んでいます。 vector<TestCls>:: iterator it = &array[2] ; iteratorのitに、arrayの動的配列2番目のアドレスを参照渡し?しています。 UNIXでは、ビルドと動作は確認できたのですが、 CYGWINでは、ビルドができませんでした。 ビルドオプションなど、足りないものがあるのでしょうか? 下記サンプルソースを置きます。 ##################################### ☆☆☆TestCls.h☆☆☆ #ifndef TESTCLS_H_ #define TESTCLS_H_ class TestCls { private: int age ; public : TestCls() ; virtual ~TestCls() ; void setAge(int ax) { age = ax ;} int getAge() { return age ; } } ; #endif /*TESTCLS_H_*/ ##################################### ☆☆☆TestCls.cpp☆☆☆ #include "TestCls.h" TestCls::TestCls() {} TestCls::~TestCls() {} ##################################### ☆☆☆testmain.cpp☆☆☆ #include<vector> #include<iostream> #include "TestCls.h" int main() { using namespace std ; vector<TestCls> array ; int i; for(i=0; i<10; i++) { TestCls clstestCls ; clstestCls.setAge(i+10) ; array.push_back(clstestCls) ; } vector<TestCls>::iterator it = &array[2] ; // ←ここでエラー発生。 while(it != array.end()) { cout << it->getAge() << endl ; ++it ; } return 0 ; } ##################################### ビルドオプションは、 g++ -I"c:\~~\inc" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/testmain.d" -MT"src/testmain.d" -o"src/testmain.o" "../src/testmain.cpp" エラーメッセージは、 error: conversion from `TestCls*' to non-scalar type `__gnu_cxx::__normal_iterator<TestCls*, std::vector<TestCls, std::allocator<TestCls> > >' requested

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

基本的に、vectorのイテレータに生ポインタを代入する、なんていう無茶なことをしてはいけません。 そのUnixのコンパイラで使ってるSTLが、「たまたま」、vectorのイテレータとして、生ポインタのtypedefを使うという実装をしていたのでしょう。 UNIX、Windowsの問題ではないです。STLライブラリ(とコンパイラ)の違いです。 vector<TestCls>::iterator it = array.begin(); it += 2; とかやるんでしょうね。

sakuody
質問者

お礼

rabbit_catさん 回答ありがとうございます。 STLライブラリがあるとは、知りませんでした。 UNIXのソースを極力いじりたくない意向があったのですが、 デバッグオプションでビルド時に切り替える事にします。 貴重な教示ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

array.begin()+2 でいいような気もします>#2.

sakuody
質問者

お礼

Tacosanさん 回答ありがとうございます。 少ない行で対応したいので、array.begin()+2を採用させて頂きます。 多謝

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

エラーになる方が正常だと思いますが。

sakuody
質問者

お礼

回答ありがとうございます。 なぜ、エラーになるのでしょうか? UNIXでは、正常にビルドと、動作は確認できています。 何が違うのでしょうか?

関連するQ&A