5

テンプレート関数の結果を入力として受け取る関数をいくつか書いています。

int alg1(Vect3) {...}
...
int algN(Vect3) {...}

void main() {
    alg1( mat.topRightCorner<3,1>() )
}

ここで、興味がある場合は、 EigenのメソッドでtopRightCornerある の部分行列を返します。ここで、次元は、コンパイル時に既知の場合にテンプレート パラメーターとして配置されます。mat

ただし、このように、マクロを使用して異なるアルゴリズムをすばやく切り替える「ショートカット」を作成します (実際のコードでは関数が何度も呼び出されるため)。

#define ALG(X)    ( algN(X) )

ALG( mat.topRightCorner<3,1>() )

マクロは正しく展開されていますが、2 つの異なるパラメーターのように何らかの形で誤解されているため、エラーが発生しmat.topRightCorner<3ます1>()

入力を角かっこで囲むとうまくいきますが、なぜこの動作になるのでしょうか?

4

1 に答える 1

5

,これは、新しいマクロ引数の区切り記号としてプリプロセッサによって受け入れられ、テンプレート パラメーター リストの区切り記号として意図された可能性があることをプリプロセッサが気にしないためです。

もう少し正確に言うと:

ALG( mat.topRightCorner<3,1>() )
     ^^^^^^^^^^^^^^^^^^^^ ^^^^

これらはどちらも字句的に有効なマクロ引数のように見え、マクロの解析が優先されます。

一方、プリプロセッサは何を()行うかを認識しているため、そのように単一の引数として解析を「強制」できます。

于 2012-11-07T16:14:34.923 に答える