Нет. Имя макроса должно быть идентификатором; он не может состоять из других символов и не может состоять из нескольких токенов.
#define template
недопустимо, потому что template
не является идентификатором, это ключевое слово.
#define foo:: foo<T>::
был действителен в C90 и C ++ 98: он определяет макрос с именем foo
, который заменяется на :: foo<T>::
(это не то, что вы хотите сделать, но это было допустимо ). Однако это недопустимо в C99 и C ++ 11, поскольку в более новых версиях языков должен быть пробел между именем объектоподобного макроса и его списком замены (токенами, на которые он заменяется).