Я использую устаревшую Visual Studio 2008 (позвольте мне избавить вас от проблем "вот ваша проблема".) Это похоже на проблему с Visual Studio: http://rextester.com/XKFR77690 Похоже, это проблема с макросом assert
: http://ideone.com/bhxMi0
Учитывая эти структуры:
struct base { virtual ~base() {} };
template <typename T>
struct Foo : base { T foo; };
Я могу сделать это:
base* test = new Foo<pair<int, int>>;
if(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL) cout << "hello world\n";
Но когда я использую тот же самый код, что и в операторе if
в assert
: assert(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL)
, я получаю сообщение об ошибке:
предупреждение C4002: слишком много фактических параметров для макроса
assert
ошибка C2143: синтаксическая ошибка: отсутствует ',' перед ')'
Кстати, я могу исправить это, используя приведение в стиле C: assert((Foo<pair<int, int>>*)(test) != NULL)
Но я думаю, что приведение в стиле C сделает static_cast
, а не dynamic_cast
, чего я не хочу.