Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.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++;模板类继承 我已经移植了一些C++代码,它是在很久以前编写的,通常是用Visual C++(Visual Studio 7.1版本)和英特尔C++编译器11编译的,目标平台是Linux(SUSEX8664),GCC 4.3.2和英特尔C++编译器11.1 < /P>_C++_Visual C++_Templates_Gcc - Fatal编程技术网

C++;模板类继承 我已经移植了一些C++代码,它是在很久以前编写的,通常是用Visual C++(Visual Studio 7.1版本)和英特尔C++编译器11编译的,目标平台是Linux(SUSEX8664),GCC 4.3.2和英特尔C++编译器11.1 < /P>

C++;模板类继承 我已经移植了一些C++代码,它是在很久以前编写的,通常是用Visual C++(Visual Studio 7.1版本)和英特尔C++编译器11编译的,目标平台是Linux(SUSEX8664),GCC 4.3.2和英特尔C++编译器11.1 < /P>,c++,visual-c++,templates,gcc,C++,Visual C++,Templates,Gcc,问题是这样的代码 文件a.h template<typename T, int dim> class A { public: A(){}; ~A(){}; protected: void foo1(){}; } 模板 甲级 { 公众: A(){}; ~A(){}; 受保护的: void foo1(){}; } 文件B.h #include "FileA.h" template<typename T> class B : public A<T, 2

问题是这样的代码

文件a.h

template<typename T, int dim>
class A
{
 public:
  A(){};
  ~A(){};
 protected:
  void foo1(){};
}
模板
甲级
{
公众:
A(){};
~A(){};
受保护的:
void foo1(){};
}
文件B.h

#include "FileA.h"
template<typename T>
class B : public A<T, 2>
{
 public:
  B(){};
  ~B(){};
  void foo(){ foo1(); }
}
#包括“FileA.h”
模板
B类:公共A
{
公众:
B(){};
~B(){};
void foo(){foo1();}
}
main.cpp

#include "FileB.h"
int main()
{
 B<float> b = B<float>();
}
#包括“FileB.h”
int main()
{
B=B();
}

不编译在Linux(英特尔C++ 11.1,GCC 4.3.2)上,而是在Windows(Visual C++ 7.1,英特尔C++ 11)上完美编译,当然它不必依赖于平台。 GCC告诉我如果我改变Foo1()到Foo1(tA),它将工作(而且它确实),但是我不能改变代码,并且必须使用英特尔C++来最终发布。


如果有人能提供任何建议,我将非常高兴。

foo1
不是依赖表达式,因此基类(依赖类型)不用于解析
foo1
调用


因为你不能更改代码,所以你已经吃饱了。如果可以更改代码,则需要将表达式更改为依赖。通常,这是通过将其更改为
this->foo1()
foo1
而实现的,因此基类(依赖类型)不用于解析
foo1
调用


因为你不能更改代码,所以你已经吃饱了。如果可以更改代码,则需要将表达式更改为依赖。通常,将其更改为
this->foo1()

这是模板的一个众所周知的问题。这在

中进行了解释,这是模板的一个众所周知的问题。GCC4.4.1(操作系统是Ubuntu)版本中的

解释了这一点。通过对编译器使用
-fppermissive
选项,我可以将编译错误转化为编译警告

编辑:某些编译器接受它的事实并不意味着它将在未来的版本中继续接受它。

在gcc 4.4.1(操作系统是Ubuntu)版本中,我可以通过对编译器使用
-fpermissive
选项将编译错误转化为编译警告


编辑:某些编译器接受它的事实并不意味着它将在未来的版本中继续接受它。

是的,这很有效,谢谢。为什么Windows代码中的Visual C++和英特尔C++ 11代码是好的?@ NEX: Visual C++是依赖名的LXXIST。这不是标准,也不可能改变。你可以忘记<代码>类型名称<代码>,或者忘记明确地限定依赖函数调用,它将不可移植地工作。我并不惊讶Visual C++(7.1)是标准的,但英特尔C++更让人吃惊,考虑到Windows版本是11,莱纳斯版本是111YES,这就行了,谢谢。为什么Windows代码中的Visual C++和英特尔C++ 11代码是好的?@ NEX: Visual C++是依赖名的LXXIST。这不是标准,也不可能改变。你可以忘记<代码>类型名<代码>,或者忘记明确地限定依赖函数调用,它将不可移植地工作。我并不惊讶VisualC++(7.1)是标准的,实际上,但更让英特尔感到惊讶的是C++。考虑到Windows版本是11.0,Linus版本是11.1,除非它会在发生更改时破坏客户的代码库。所以我们被Visual C++的LXXIST行为所困扰。使用/W4,您会收到警告。不过,如果它发生更改,将破坏客户的代码库。所以我们被Visual C++的LXXIST行为所困扰。使用/W4,您会收到警告。