аргументы шаблона типа restrict-pointer и переопределение виртуальных методов шаблонного базового класса

Я полагаю, что следующее должно компилироваться и связываться, но это не так:

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

Решение

__restrict__ Ключевое слово, кажется, не создает новый тип:

Как и во всех внешних квалификаторах параметров, __restrict__ игнорируется в
соответствие определения функции. Это означает, что вам нужно только указать
__restrict__ в определении функции, а не в прототипе функции.

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

Удаление __restrict__ в параметре шаблона и в определении чистой виртуальной функции, оставляя его в определении самой функции, похоже, вы достигаете того, чего хотите.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]