Следующий шаблон функции со специализациями должен использоваться только в одном файле .cpp
, поэтому я хотел бы сделать его static
. Следующий код компилируется (без предупреждений) с использованием как MS Visual C++ 2008, так и GCC 4.8.1 и работает так, как предполагалось. (Добавление static
в начало строк 5 и 11 приведет к тому, что GCC выдаст ошибку, но не MSVC.)
1 template <class T>
2 static bool foo(const T param);
3
4 template <>
5 bool foo<int>(const int param)
6 {
7 return doSomethingWithInt(param);
8 }
9
10 template <>
11 bool foo<bool>(const bool param)
12 {
13 return doSomethingWithBool(param);
14 }
Однако средство проверки MISRA C++ жалуется:
- (MISRA2008.3-3-2) Применение статического ключевого слова к объявлению 'foo' (1)
- (MISRA2008.3-3-2) Применение статического ключевого слова к объявлению «foo» (5)
- (MISRA2008.2-10-5-b) Идентификатор 'foo' используется повторно (5)
- (MISRA2008.3-3-2) Применение статического ключевого слова к объявлению 'foo' (11)
- (MISRA2008.2-10-5-b) Идентификатор 'foo' используется повторно (11)
Я попытался выяснить, что не так, и нашел подсказку в стандартной цитате C++:
Для вызова функции, который зависит от параметра шаблона, если имя функции является неполным идентификатором, но не идентификатором шаблона, функции-кандидаты находятся с использованием обычных правил поиска (3.4.1, 3.4.2), за исключением того, что:
- Для части поиска, использующей поиск по неполному имени (3.4.1), обнаруживаются только объявления функций с внешней связью из контекста определения шаблона.
Означает ли это, что компиляторы отбрасывают спецификацию static
и нет возможности создавать шаблоны статических функций в C++03?
namespace { template<class T> void Foo() { ... } }
. Не уверен, что средство проверки MISRA достаточно умно, чтобы знать, что оно сделает то же самое. - person metal   schedule 11.09.2014static
будет работать. - person jxh   schedule 12.09.2014MISRA checker
вы используете? - person Andrew   schedule 06.11.2014