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__限定符,它会编译和链接。我究竟做错了什么?

笔记:

  • 这是关于限制限定符和模板的唯一问题(截至撰写本文时)。有趣,不是吗?
  • 我将 GCC 4.9.3 与--std=c++11.
4

1 回答 1

1

__restrict__关键字似乎并没有真正创建一个新类型:

与所有最外层的参数限定符一样,__restrict__在函数定义匹配中被忽略。这意味着您只需要 __restrict__在函数定义中指定,而不是在函数原型中指定。

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

不过,删除__restrict__模板参数和纯虚函数定义,同时将其保留在函数定义本身中似乎可以实现您想要的。

于 2016-03-06T23:31:30.390 回答