0

元々Linuxで開発されたVisual Studio 2017でC++コードをコンパイルしようとしています。プロジェクトはLinuxではコンパイルされますが、VSではコンパイルされません。このエラーは、マクロを使用してテンプレートパラメータを比較しようとしたときに発生します。MSVCのマクロにテンプレートパラメータを渡す

#define EXPECT_MATRIX_EQUAL(...) \ 
NAVUTILS_TEST_MATRIX_EQUAL_(GTEST_NONFATAL_FAILURE_, __VA_ARGS__) 

#define NAVUTILS_TEST_MATRIX_EQUAL_(fail, expected, actual, ...) \ 
NAVUTILS_TEST_EQUAL_(expected, \ 
        actual, \ 
        __matrices_equal(expected, actual, ##__VA_ARGS__), \ 
        fail) 
#define NAVUTILS_TEST_EQUAL_(expected, actual, testExpr, fail) \ 
GTEST_TEST_BOOLEAN_(testExpr, #testExpr, actual, expected, fail) \ 
<< "Value of " #expected " [" << (expected).rows() << " x " << (expected).cols() << "]:\n" \ 
<< (expected) \ 
<< "\n\nValue of " #actual " [" << (actual).rows() << " x " << (actual).cols() << "]:\n" \ 
<< (actual) \ 
<< "\n\n" 

エラー:

C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): warning C4003: not enough actual parameters for macro 'NAVUTILS_TEST_MATRIX_EQUAL_' 
C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): error C2059: syntax error: ')' 
C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): error C2181: illegal else without matching if 
C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): error C2065: 'gtest_ar_': undeclared identifier 
C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): error C2228: left of '.c_str' must have class/struct/union 
C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'testing::internal::AssertHelper' 
C:\Users\ANTadmin\Desktop\scorpion-cpp\test\include\LinearFilterTests.h(19): note: No constructor could take the source type, or constructor overload resolution was ambiguous 

私は」を

コール: 'filter.xhat' と 'マット' は、両方のベクトル

が定義されている

EXPECT_MATRIX_EQUAL(filter.xhat, mat); 

何か特別なことがあると仮定してm私が紛失しているマクロがどのように使われているのかを知っています。私が調査したことから、オーバーロードされたマクロは適切に処理されなければならないので、なぜこれらのエラーが出るのか理解できません。

答えて

1

ここでの主な問題は、MSVCがマクロ展開内のマクロ呼び出しで__VA_ARGS__を処理する方法です。 this questionと、標準の解釈についてMicrosoftからの声明を含む回答を参照してください。その質問への受け入れ答えで提案されているように解決策は、間接の余分なレベルです:

#define EXPAND_(X) X 
#define EXPECT_MATRIX_EQUAL(...) \ 
EXPAND_(NAVUTILS_TEST_MATRIX_EQUAL_(GTEST_NONFATAL_FAILURE_, __VA_ARGS__)) 

は別の問題もあります:

前の 含む避けるために##の使用
__matrices_equal(expected, actual, ##__VA_ARGS__), \ 

__VA_ARGS__が空の場合はGCC拡張であり、ポータブルコードでは使用しないでください。しかし、それは明らかにMSVCで動作します。

関連する問題