0

下應,我相信,編譯和鏈接,但並不:限制指針型模板參數和模板化基地的重寫虛方法的類

template<class S> 
class A { 
public: 
    virtual int foo(S arg) = 0; 
    virtual ~A() { } 
}; 

class B : public A<int* __restrict__> 
{ 
public: 
    int foo(int* __restrict__ arg) override { return 0; } 
}; 

int main() { B b; }   

編譯器輸出:

d9.cpp:11:6: error: ‘int B::foo(int*)’ marked override, but does not override 
    int foo(int* __restrict__ arg) override { return 0; } 
    ^
d9.cpp: In function ‘int main()’: 
d9.cpp:14:16: error: cannot declare variable ‘b’ to be of abstract type ‘B’ 
int main() { B b; } 
       ^
d9.cpp:8:7: note: because the following virtual functions are pure within ‘B’: 
class B : public A<int* __restrict__> 
    ^
d9.cpp:4:14: note: int A<S>::foo(S) [with S = int* __restrict__] 
    virtual int foo(S arg) = 0; 

如果我在兩個地方刪除了__restrict__限定符,它會編譯並鏈接。我究竟做錯了什麼?

注:

  • 這是唯一問題,關於SO(截至截稿時)兩個方面的限制預選賽和模板。很好笑,不是嗎?
  • 我使用GCC 4.9.3和--std=c++11
+0

什麼是編譯器錯誤? – tahsmith

+0

「我做錯了什麼?」期待編譯器的擴展帶來另一種語言的特性與C++特有的功能無縫集成 –

+0

@Revolver_Ocelot:但是'restrict'非常重要......它不是一個不太好用的功能。 – einpoklum

回答

1

__restrict__關鍵字似乎並不真正創造一個新的類型:

與所有最參數預選賽,__restrict__在 函數定義匹配被忽略。這意味着您只需在函數定義中指定 __restrict__,而不是在函數原型中指定。

https://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html

拆卸模板參數和純虛函數的定義__restrict__而把它留在函數定義本身似乎達到你想要什麼,雖然。

相關問題