以下は、コンパイルしてリンクする必要があると思いますが、そうではありません。
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
ます。