2017-08-21 18 views
0

私には夢中になる質問がありますが、おそらく皆さんのためのケーキです。私は4つの数字からなる構造を定義し、この構造のベクトルを返す関数を持っています。私のヘッダファイルは、次のようになります。C++:ヘッダーファイル内の構造体のベクトル

Legendre.hpp

#include <opencv2/opencv.hpp> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> //as suggested, but it doesn't help 

#ifndef LEGENDRE_HPP_ 
#define LEGENDRE_HPP_  

struct FourDoubles { 

    double Zeroth; 
    double First; 
    double Second; 
    double Third; 
}; 

std::vector<FourDoubles> LegendreLookupTable(int size); 

#endif /* LEGENDRE_HPP_ */ 

(実際にはいくつかのより多くの機能がありますが、これだけ含ま一見無意味を無視する) それから私は、ヘッダーを使用して、次のcppファイルを持っています:

Legendre.cpp

#include "Legendre.hpp" 

using namespace std; 
using namespace cv; 

vector<FourDoubles> LegendreLookupTable(int size) { 

    vector<FourDoubles> res(size); 
    int i; 
    double x,x2,x3,x4; 

    for(i=0;i<size;i++) { 

    x=2.0*i/(size-1.0)-1.0; 
    x2=x*x; 
    x3=x2*x; 
    x4=x3*x; 
    res[i].Zeroth=x; 
    res[i].First=1.5*x2-0.5; 
    res[i].Second=2.5*x3-1.5*x; 
    res[i].Third=4.375*x4-3.75*x2+0.375; 
    } 

return res; 
} 

誰でも好奇心旺盛で念のために:私は、画像のルジャンドルモーメントを計算しています。しかし、私がこれをコンパイルしたいとき、コンパイラは "Field 'Zeroth'は解決できませんでした。他のフィールドと同じです。

私は私のファイルに他のすべてをコメントアウトするときにエラーがすでに発生して

#include "Legendre.hpp" 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
} 

のように私の主なルックスは、私が手にエラーが D

escription Resource Path Location Type 
Field 'Third' could not be resolved Legendre.cpp /Finder line 108 Semantic Error 
Field 'Second' could not be resolved Legendre.cpp /Finder line 107 Semantic Error 
Field 'Zeroth' could not be resolved Legendre.cpp /Finder line 105 Semantic Error 
Field 'First' could not be resolved Legendre.cpp /Finder line 106 Semantic Error 

(ドン」と同じくらい簡単であるとき私が言ったように、私は多くのものをコメントアウトしました)

2つのことは私には非常に奇妙です:私はベクトルを宣言していないが、直接FourDoublesは

vector<FourDoubles> LegendreLookupTable(int size) { 

    ... 
    FourDoubles test; 
    test.Zeroth=5.5; 
    ... 
} 

それは完全に正常に動作します。また、私のメインファイルにすべてのものを直接書き込むと、

struct FourDoubles { 

    double Zeroth; 
    double First; 
    double Second; 
    double Third; 
}; 

std::vector<FourDoubles> LegendreLookupTable(int size); 

int main() { 

    ... 
} 

vector<FourDoubles> LegendreLookupTable(int size) { 
    ... 
} 

私はおそらくここに非常に基本的な何かが欠けていますが、それはメインファイルで宣言されていますしない限り、それは私の構造体のベクトルを扱うことができない理由を私は理解していません。啓発の助けがあれば深く感謝します。

+5

'vector'をインクルードしましたか? – MikeCAT

+4

[最小、**完全**、および検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。また、可能な情報メモを含め、完全で完全な(修正なしの)エラー出力をコピーして(テキストとして)貼り付けます。 –

+0

申し訳ありませんが、私はいくつかの説明を編集します、分を教えてください。しかし、コンパイル時に既にエラーが発生しているので、実際には完全な例を掲載しています。私はちょうど私のメインファイルが空である場合でも、構造体と関数以外のすべてをコメントアウトしました。しかし、私はエラー出力を追加します。 – JayD

答えて

4

あなたはhppファイルに<vector>ヘッダーを含めるのを忘れてしまいました。それがエラーの本当の原因です。なぜなら、構造体のベクトルではなく、むしろ裸の構造体を宣言すれば、それが機能する理由です。

+0

お返事ありがとうございました。私はちょうど私のHPファイルに "#"を追加しました - 私はまだ同じエラーが発生します。また、私は前にメインファイルにそのヘッダーを追加しなかったと私は言ったように、私は私の構造と関数は、メインファイルで宣言している場合、全体のベクトル事はちょうど期待どおりに動作します。 (考えてみると、ヘッダーを含めないとなぜ機能するのだろう) – JayD

+0

それは面白いです。あなたのコードをコピーして私のケースで動作させました(Visual Studio 2015)。どのopenCVバージョンを使用していますか?あなたのcppファイルから 'namespace std/cv'を使い捨てにして、関数定義で明示的に' std :: vector'を使うと何か変わるのですか? – KjMag

+0

興味深いのは面白いです、笑。私はopenCV 3.2.0を使用していますが、それはopenCVにも接続されますか?私はちょうど同じ名前空間を使用して削除しました。私はを除いてすべてのインクルードを殺しました。私は後で別のコンピュータでそれをテストすることができます。おそらく、私のシステムに何か問題があります。 (私は途中でeclipseを使用しています) – JayD

0

ご迷惑をおかけしました。本当の人生と呼ばれるその厄介なことが蹴られ、私は最後の日に忙しかった。別のコンピュータで自分のコードをチェックしたところ、エラーはありません。私がプログラミングについて知っていたと思ったことは正しかったし、親愛なるUbuntuのどこかに(あるいは多分gccの中で)変なバグがあるはずです。だから、私が懸念している限り、その質問は閉鎖することができます。

ありがとうKjMag。あなたは何が起こっているかを知るのを手伝った。良い一日を。

関連する問題