Есть ли способ написать программу так, чтобы синтаксически она была действительной, но когда расширение шаблона выполнено, возникает ошибка?
Зависит от того, является ли ваше определение синтаксически действительным g++
-fsyntax-only
или нет.
Следующая простая тестовая программа иллюстрирует это и, я полагаю, отвечает на ваш вопрос:
// test.cpp
template< bool > struct test;
template< > struct test< true > { };
int main(void) {
test< false > t;
return 0;
}
Попытка построить:
$ g++ /tmp/sa.cpp
test.cpp: In function `int main()':
test.cpp:6: error: aggregate `test< false> t' has incomplete type and
cannot be defined
$ g++ -fsyntax-only /tmp/sa.cpp
test.cpp: In function `int main()':
test.cpp:6: error: aggregate `test< false> t' has incomplete type and
cannot be defined
Так что да, -fsyntax-only
выполняет расширение шаблона .