-1

Code::Blocks を使用して C++ で学術的なプロジェクトを行っていますが、奇妙な可視性エラーが発生します。

部分的なメイン ファイルは次のとおりです。

//main.cpp
#include <iostream>
#include <fstream>
#define DEFContainerSize 100
#include <string>
#include <list>
#include <sstream>
#include <cctype>
using namespace std;

#include "iteration1.cpp"
#include "iteration2.cpp"

int main(int argNum, char *args[])
{
    //Content skipped here!!
}

同梱の iteration1.cpp には、次のような定義が含まれています。

//部分反復1.cpp

//Content skipped here!!

        template <class Coords, class Rad>
        struct
Circle  {
            Coords Coordinates;
            Rad    Radius;
        };

//Content skipped here!!

        template <class Coords, class Rad>
        istream
    &operator>>(istream &input, Circle<Coords,Rad> &circle)
        {
            StringFunctionAndArguments fa;
            input>>fa;
            proc_FromStringFunctionAndArguments2<Coords,Rad>
                (fa,"Circle","operator>>",circle.Coordinates,circle.Radius);
            return input;
        };

        template <class Coords, class Rad>
        ostream
    &operator<<(ostream &output, Circle<Coords,Rad> &circle)
        {
            output<<"Circle("<<circle.Coordinates<<","<<circle.Radius<<")";
            return output;
        };

//Content skipped here!!

そして、これはうまく機能します。しかし、同様の定義を iteration2.cpp に入れようとすると、次のようになります。

//iteration2.cpp this time full file.

        template <class Coords>
        struct
Triangle
        {
            Coords Coordinates1,
                   Coordinates2,
                   Coordinates3;
        };

        template <class Coords>
        istream
    &operator>>(istream &input, Triangle<Coords> &tr)
        {
            StringFunctionAndArguments fa;
            input>>fa;
            proc_FromStringFunctionAndArguments2<Coords,Coords>
                (fa,"Triangle","operator>>",tr.Coordinates1,
                                            tr.Coordinates2);
            tr.Coordinates3 = fa.Arguments.back();
            return input;
        };

        template <class Coords>
        ostream
    &operator<<(ostream &output, Triangle<Coords> &tr)
        {
            output<<"Triangle("<<tr.Coordinates1<<
                            ","<<tr.Coordinates2<<
                            ","<<tr.Coordinates3<<")";
            return output;
        };

発生してはならない奇妙なエラーが発生します。

stud\1mTRPO\labs\1\Lab2\iteration2.cpp|17|error: 'istream' does not name a type|
stud\1mTRPO\labs\1\Lab2\iteration2.cpp|30|error: 'ostream' does not name a type|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 4 seconds) ===|

通常は iteration1.cpp に追加できますが、iteration2.cpp に追加する必要があります。

Windows XP で Code::Blocks 12.11 を使用しています。

mingw32-g++.exe -std=c++11 -Wall -fexceptions  -g

IDEを変更する時が来ましたか?

どうすれば問題を解決できますか? 事前に回答いただきありがとうございます!

4

2 に答える 2

0

見た目から、コンパイラはiteration2.cppスタンドアロンの翻訳単位としてコンパイルされます! 私はお勧めします:

  1. から見えるようにする必要があるエンティティを宣言するヘッダー ファイルを作成しiteration2.cpp(おそらく同様にiteration1.cpp)、geader がその前にある他のヘッダーに依存せずに動作することを確認します。
  2. #includeヘッダーを使用するようにディレクティブを変更します。
  3. 適切iteration2.cppな翻訳単位に変換します。つまり、独自のヘッダーと依存するすべてのものを含めます。
于 2013-11-07T09:22:02.920 に答える