5

テンプレート機能があります:

template <typename T>
inline void Acquire_Store(volatile T* ptr, T value) {
  // ...
}

次のように呼び出そうとすると:

volatile Node* node;
Acquire_Store(&node, static_cast<Node*>(nullptr));

g++ と clang++ の両方のコンパイラは、次のように言います。

パラメータ 'T' の競合する型を推定 ('volatile List::Node *' 対 'List::Node *')

このテンプレート関数を呼び出す正しい方法は何ですか?

アップデート。

のタイプがよくわかりませnodeん - に変更する必要があるかもしれませんNode* volatile node;

変数を揮発性にしたいのですnodeが、ポイントされたオブジェクトはそうではありません。

4

3 に答える 3

2

置換と演繹は、字句的にマクロとは異なります。volatile T*なりませんvolatile Node**volatile Node* volatile*。2 番目の volatile はテンプレートから取得されます。volatile Node*これにより、最初のパラメーターのT が等しくなります。

volatile を常に最初にくっつけないようにしてください。volatile ポインターは、星の前ではなく、星の後に volatile を持ちます。

于 2013-08-16T08:49:46.377 に答える
0

問題は、volatile修飾子が T 型にバインドされていることです。

template <typename T>
inline void Acquire_Store(volatile T* ptr, T value)

したがってT = Node *、上記の場合、揮発性であるのはノードへのポインターであり、ノード自体ではありません。指すオブジェクトを volatile 修飾するには、T の一部である必要があります。これは、2 番目のパラメーターが非揮発性であるため、問題を引き起こします。T は同時に揮発性と非揮発性の両方になることはできません。

できることは、T = volatile Node *type_traits を使用して volatile 修飾子を作成し、2 番目の引数から削除することです。

template <typename T>
inline void Acquire_Store(T *ptr, typename std::remove_volatile<T>::type value);

これはすべて const 修飾子にも適用されることに注意してください。Ideone は const qualifier についてこれをデモします。

于 2013-08-16T08:46:00.530 に答える