Поделиться через


Предупреждение компилятора (уровень 4) C4347

Обновлен: Ноябрь 2007

Сообщение об ошибке

изменение поведения: "шаблон функции" вызывается вместо "функции".
behavior change: 'function template' is called instead of 'function'.

В Visual Studio .NET если существуют шаблонная и нешаблонная функция с одним и тем же именем, компилятор неправильно обрабатывает нешаблонную функцию как специализацию шаблонной функции.

Для кода, который корректно функционирует во всех версиях Visual C++, следует добавить template<> над нешаблонной функцией, в результате чего эта функция будет преобразована в действительную явную специализацию.

Дополнительные сведения см. в разделе Сводная информация о критических изменениях, которые могут приводить к ошибкам компиляции.

Данное предупреждение по умолчанию отключено. Дополнительные сведения см. в разделе Отключенные по умолчанию предупреждения компилятора.

Пример

Следующий пример демонстрирует причины возникновения ошибки C4347.

// C4347.cpp
// compile with: /W4 /EHsc
#pragma warning (default : 4347)

template <typename T>
void f(T t) { T i = t; i = 0; }

void f(int i) { i++; }

// OK
template <typename T>
void f2(T t) { T i = t; i = 0; }

template <>
void f2(int i) { i++; }

int main() {
   f(5);   // regular function call
   f<int>(5);   // C4347 calls implicit instantiation

   f2(5);
   f2<int>(5);
}