代码::带有C++块的可见性错误很奇怪

Strange visibility error in Code::Blocks with C++

本文关键字:错误 可见性 带有 C++ 代码      更新时间:2023-10-16

我在C++上做了一些学术项目,使用Code::Blocks,我得到了一些奇怪的可见性错误。

部分主文件为:

//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!!
}

包含的迭代 1.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!!

这工作得很好。但是当我尝试在迭代2中输入类似的定义时.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;
        };

我收到奇怪的错误,这不应该发生:

stud1mTRPOlabs1Lab2iteration2.cpp|17|error: 'istream' does not name a type|
stud1mTRPOlabs1Lab2iteration2.cpp|30|error: 'ostream' does not name a type|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 4 seconds) ===|

我仍然可以正常地将其添加到迭代 1.cpp,但我在迭代 2.cpp 中需要它。

我在Windows XP上使用Code::Blocks 12.11,编译

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

是时候更换 IDE 了吗?

如何解决问题?提前感谢您的回答!

从外观上看,编译器将iteration2.cpp编译为独立的翻译单元!我会重新评论:

  1. 创建一个头文件,声明需要从iteration2.cpp可见的实体(同样可能对于iteration1.cpp),并确保 geader 在不依赖它前面的其他标头的情况下工作。
  2. 更改 #include 指令以使用该标头。
  3. iteration2.cpp变成一个适当的翻译单元,即包括它自己的标题以及它所依赖的一切。

问题在于文件添加不正确。

正确的方法是:

1)右键单击{项目名称}-->添加文件。添加新文件 {文件名}。

2) 右键单击 {文件名} --> 属性... --> 构建 --> 取消选中"属于目标"字段中的所有框。

3) ????

4)利润!!