2016-04-05 20 views
0

変数の名前を入力するだけで、Matlabのように変数の値をチェックしたいだけです。私はcout << img_names;コードの1行をサンプルオープンソースコードに挿入しましたが、Visual Studioのエラーリストにはno operator "<<" matches these operandsがあります。しかし、私はサンプルコードの他の部分でうまく使用されているcoutを参照してください。以下は、COUTが挿入されているサンプルコードの最初の部分である:C++でベクトルの値を表示/チェックする方法

#include <iostream> 
#include <fstream> 
#include <string> 
#include "opencv2/opencv_modules.hpp" 
#include <opencv2/core/utility.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include "opencv2/highgui.hpp" 
#include "opencv2/stitching/detail/autocalib.hpp" 
#include "opencv2/stitching/detail/blenders.hpp" 
#include "opencv2/stitching/detail/timelapsers.hpp" 
#include "opencv2/stitching/detail/camera.hpp" 
#include "opencv2/stitching/detail/exposure_compensate.hpp" 
#include "opencv2/stitching/detail/matchers.hpp" 
#include "opencv2/stitching/detail/motion_estimators.hpp" 
#include "opencv2/stitching/detail/seam_finders.hpp" 
#include "opencv2/stitching/detail/util.hpp" 
#include "opencv2/stitching/detail/warpers.hpp" 
#include "opencv2/stitching/warpers.hpp" 

using namespace std; 
using namespace cv; 
using namespace cv::detail; 

static void printUsage(){ ... } 

// Default command line args 
vector<String> img_names; 
bool preview = false; 
bool try_cuda = false; 
double work_megapix = 0.6; 
double seam_megapix = 0.1; 
double compose_megapix = -1; 
float conf_thresh = 1.f; 
string features_type = "surf"; 
string ba_cost_func = "ray"; 
string ba_refine_mask = "xxxxx"; 
bool do_wave_correct = true; 
WaveCorrectKind wave_correct = detail::WAVE_CORRECT_HORIZ; 
bool save_graph = false; 
std::string save_graph_to; 
string warp_type = "spherical"; 
int expos_comp_type = ExposureCompensator::GAIN_BLOCKS; 
float match_conf = 0.3f; 
string seam_find_type = "gc_color"; 
int blend_type = Blender::MULTI_BAND; 
int timelapse_type = Timelapser::AS_IS; 
float blend_strength = 5; 
string result_name = "result.jpg"; 
bool timelapse = false; 
int range_width = -1; 

static int parseCmdArgs(int argc, char** argv){ ... } 

int main(int argc, char* argv[]) 
{ 
#if ENABLE_LOG 
    int64 app_start_time = getTickCount(); 
#endif 

#if 0 
    cv::setBreakOnError(true); 
#endif 

    int retval = parseCmdArgs(argc, argv); 
    cout << img_names; 
    if (retval) 
     return retval; 

much more code continues... 

にはどうすれば変数の値を取得するために、適切coutを使用するのですか簡単な方法はありますか?

+0

この機能は、オペレータのオーバーロードと呼ばれています(それを見てください!あなたは多くの良い答えを得るでしょう)。 '<<"演算子は2つの引数をとります。最初のものは、使用されているストリーム(ほぼ確実にstd :: ostream)への参照を取ります.2番目は、印刷したいオブジェクトへの定数参照です。ここではあまり詳しく説明しません。しかし多態型を使用する場合は、そのクラスのprintメソッドだけを呼び出すことができます。そして、すべてのクラスに対して '<<'演算子を定義する必要はなく、より良いカプセル化を提供します。これはアクセス可能なクラス( 'vector'ではなく)にのみ適用されます。 – patrik

+0

Tq! D – SK90

答えて

3

operator <<std::vectorには、そのタイプを印刷する標準的な方法がないため、定義されていません。

std::ostream& operator<< (std::ostream& out, const std::vector<String>& vec) 
{ 
    for (int i = 0; i < vec.size(); i++) 
     out << vec[i] << " "; // or whatever formatting you like 

    return out; 
} 
+0

あなたのコードに 'std :: string'もあるので、' String'が何であるのか分かりませんが、 'operator <<'も同様に定義されていると仮定しています(おそらく単にタイプミス) – vu1p3n0x

+0

ありがとう!私はまた、それを使用して見つけた? (変数名)をデバッグモードでコマンドウィンドウに表示する代わりに、代わりに印刷することもできます([リンク](https://blogs.msdn.microsoft.com/seealso/2011/01/25/basics-of-using-the-しかし、あなたは当初の質問に答えました:) – SK90

+0

もし文字列と文字列が同じになることを意味するならば、文字列の定義はある種のクラスなのでクラスCV_EXPORTS文字列)、std :: stringは通常の文字列変数として認識されます。 – SK90

関連する問題