簡體   English   中英

C ++模板類繼承

[英]C++ template class inheritance

我一直在移植一些C ++代碼,這些代碼是很久以前編寫的,通常使用Visual C ++(Visual Studio 7.1版)和Intel C ++ Compiler 11.0進行編譯,目標平台是Linux(Suse x86-64)和GCC 4.3。 2和Intel C ++編譯器11.1

問題是這樣的代碼

文件A.h

template<typename T, int dim>
class A
{
 public:
  A(){};
  ~A(){};
 protected:
  void foo1(){};
}

文件庫

#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(Intel C ++ 11.1,GCC 4.3.2)上編譯,但是可以在Windows(Visual C ++ 7.1,Intel C ++ 11.0)上完美編譯,因此它一定不能依賴於平台。 GCC告訴我,如果將foo1()更改為foo1(T a),它將可以工作(並且可以),但是我無法更改代碼,必須使用Intel C ++進行最終發行。

如果有人可以提供任何建議,我將非常高興。

foo1不是依賴表達式,因此不使用基類(即依賴類型)來解析foo1調用。

由於您無法更改代碼,因此已被塞滿。 如果可以更改代碼,則需要將表達式更改為從屬。 通常,這是通過將其更改為this->foo1()

這是模板的一個眾所周知的問題。 C ++常見問題解答中有解釋

在gcc 4.4.1(操作系統為Ubuntu)版本上,可以通過使用-fpermissive選項將編譯錯誤轉換為編譯警告。

編輯:某些編譯器接受它的事實,並不意味着它將在將來的版本中繼續接受它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM