Первая проблема:
#include <iostream>
class Tester
{
public:
template< typename T >
static T f1();
template< typename T >
static void f2( const T& p = Tester::f1< T >() );
};
template<>
float Tester::f1()
{
return 0.0f;
}
template< typename T >
void Tester::f2( const T& p )
{
std::cout << p;
}
int main( int argc, char* argv[] )
{
Tester::f2< float >();
return EXIT_SUCCESS;
}
Вывод компиляции с использованием вышеупомянутого компилятора:
main.obj:-1: error: LNK2019: unresolved external symbol "public: static class $RBAAB __cdecl Tester::f1<`template-type-parameter-1'>(void)" (??$f1@$RBAAB@@Tester@@SA?AV$RBAAB@@XZ) referenced in function main
debug\test.exe:-1: error: LNK1120: 1 unresolved externals
MSVC ++ 2015 (14.0) не сообщает об ошибках при компиляции этого кода. Ошибка выдается, только если f1
является частью класса. f2
может быть где угодно - автономная функция или член класса.
Если вы определяете f1
вместо того, чтобы специализировать его, то есть заменить тип возврата float
:
template<>
float Tester::f1()
{
return 0.0f;
}
с T
:
template< typename T >
T Tester::f1()
{
return 0.0f;
}
вы получите следующую ошибку:
error: C1001: An internal error has occurred in the compiler.
Снова MSVC ++ 2015 не выдает никаких ошибок.
Есть идеи, почему MSVC ++ 2017 более проблематичен c?