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