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__と、コンパイルとリンクが行われます。私は何を間違っていますか?

ノート:

  • これは、restrict 修飾子とテンプレートの両方に関する SO (執筆時点) に関する唯一の質問です。おかしいですね。
  • で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 に答える