我一直在移植一些很久以前编写的C ++代码,通常用Visual C ++(Visual Studio 7.1版本)和Intel C ++ Compiler 11.0编译,目标平台是Linux(Suse x86-64), GCC 4.3.2和英特尔C ++编译器11.1
问题是像这样的代码
FileA.h
template<typename T, int dim>
class A
{
public:
A(){};
~A(){};
protected:
void foo1(){};
}
FileB.h
#include "FileA.h"
template<typename T>
class B : public A<T, 2>
{
public:
B(){};
~B(){};
void foo(){ foo1(); }
}
的main.cpp
#include "FileB.h"
int main()
{
B<float> b = B<float>();
}
不能在Linux(英特尔C ++ 11.1,GCC 4.3.2)上编译,但在Windows上完全编译(Visual C ++ 7.1,英特尔C ++ 11.0),但它肯定不能依赖于平台。 GCC告诉我,如果我将foo1()更改为foo1(T a)它将起作用(并且确实如此),但我无法更改代码,并且必须使用英特尔C ++进行最终发布。
如果有人可以提供任何建议,我会很高兴。
答案 0 :(得分:2)
foo1
不是依赖表达式,因此基类(依赖类型)不用于解析foo1
调用。
由于你无法改变代码,你就被塞满了。如果您可以更改代码,则需要将表达式更改为依赖。通常,这可以通过将其更改为this->foo1()
来完成。
答案 1 :(得分:1)
这是模板的一个众所周知的问题。它在C++ FAQ
中进行了解释答案 2 :(得分:0)
在gcc 4.4.1(os是Ubuntu)版本上,我可以通过使用编译器的-fpermissive
选项将编译错误转换为编译警告。
编辑:某些编译器接受它的事实并不意味着它将在未来的版本中继续接受它。