Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;4.1.2编译器错误_C++ - Fatal编程技术网

C++ g++;4.1.2编译器错误

C++ g++;4.1.2编译器错误,c++,C++,我有以下代码(从实际项目中剥离出来的版本)要复制 导致RHEL5(g++版本4.1.2)上出现编译器错误的问题): 同样的代码在RHEL4(g++版本3.4.6)上编译并运行得非常好!任何关于如何解决RHEL5错误(?)的解释/想法/建议将 非常感谢 编辑: 谢谢你,谢尔盖。这是我已经知道的显而易见的解决办法。但我忘了补充一点,限制是func.hpp不能编辑(例如,它的第三方写保护)。有什么解决办法吗?下面是发生的情况。定义函数func()时,编译器还不知道函数kth(const A&),因为它

我有以下代码(从实际项目中剥离出来的版本)要复制 导致RHEL5(g++版本4.1.2)上出现编译器错误的问题):

同样的代码在RHEL4(g++版本3.4.6)上编译并运行得非常好!任何关于如何解决RHEL5错误(?)的解释/想法/建议将 非常感谢

编辑:
谢谢你,谢尔盖。这是我已经知道的显而易见的解决办法。但我忘了补充一点,限制是func.hpp不能编辑(例如,它的第三方写保护)。有什么解决办法吗?

下面是发生的情况。定义函数func()时,编译器还不知道函数
kth(const A&)
,因为它是在代码后面定义的。因此,当它在func()中遇到对kth()的引用时,它假定它是对
kth(const int&)
的引用。现在当实际实例化func()时,它无法编译它,因为T是A,而不是int。我不确定为什么它在另一个版本的编译器中工作,但我认为这是因为它实际上在实例化模板函数时开始解析引用,而不是在声明模板函数时。但这看起来像是旧版本中的一个bug,因为对于这种行为,函数定义会根据实例化的位置而变化,这非常令人困惑

修复与任何编译器一起工作的代码的唯一方法是将
kth(const A&)
的定义置于
kth(const int&)
和func()之间,或者将
kth(const A&)
的前向声明置于func()之上的某个位置

更新

在不编辑func.hpp的限制下,我能想到的最佳解决方法是使用以下内容创建自定义头文件:

#include <classa.hpp>
namespace globals {
  static int kth(const A& a); // defined later, but used by func.hpp
}
#include <func.hpp>
#包括
名称空间全局变量{
static int kth(const A&A);//稍后定义,但由func.hpp使用
}
#包括

我也不明白为什么
kth(const A&)
被定义为静态的,但被全局头使用。我宁愿将其放入classa.cpp,并将其声明放入classa.hpp。但这可能是我不知道的一些设计特性或工件。

请正确格式化代码如果无法编辑func.hpp,请解决方法:在#include ing func.hpp之前,在test.cpp中声明
kth(const a&)
或#include,它将在#include ing func.hpp中得到这样的声明。但是func.hpp使用
kth
而没有看到其所有重载的声明,这是一种糟糕的形式。@aschelper:谢谢,我将对其进行测试。我建议创建一个头文件,用适当的注释转发声明
kth(const a&)
,然后包含func.hpp。然后,只要在需要的地方使用此标题,而不是func.hpp。这样,您就不必担心每次包含两个文件或复制转发声明,这更糟。谢谢Sergey。通过我的编辑(约束),@aschelper的修复程序解决了错误。
func.hpp: In function ‘int globals::func(const T&) [with T = A]’:
test.cpp:15:   instantiated from here
func.hpp:8: error: invalid initialization of reference of type ‘const int&’ from  
                   expression of type ‘const A’
func.hpp:2: error: in passing argument 1 of ‘int globals::kth(const int&)’
#include <classa.hpp>
namespace globals {
  static int kth(const A& a); // defined later, but used by func.hpp
}
#include <func.hpp>