Две неясные проблемы с компилятором MSVC ++ 2017 (15.9.28307.905) - PullRequest
2 голосов
/ 21 января 2020

Первая проблема:

#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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...