C++ 模板函数中未解析的外部符号

C++ 模板函数中未解析的外部符号,c++,function,templates,unresolved-external,C++,Function,Templates,Unresolved External,我已在Visual Studio 2019中创建了此静态库,但出现以下错误: unresolved external symbol "unsigned short __cdecl method2<unsigned short>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>> const &,unsigned shor

我已在Visual Studio 2019中创建了此静态库,但出现以下错误:

unresolved external symbol "unsigned short __cdecl method2<unsigned short>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>> const &,unsigned short)"
??$method2@G@@YAGABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@G@Z)
未解析的外部符号“无符号短\uuuuCDECL方法2(类std::basic\uString const&,无符号短)”
??$method2@G@@YAGABV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@G@Z)
//Lib.h
#布拉格语一次
#包括“Enter.h”
#包括
#包括
模板
方法1(常量std::string&=“”,T=-1);
模板
方法2(常量std::string&=“”,T=-1);

//Lib.cpp
#包括“pch.h”
#包括“Lib.h”
使用名称空间std;
无符号短方法1(常量字符串和文本,无符号短最大值)
{
串入;
无符号短val;
while(true)
{
cout max)抛出val;
}
捕获(…)
{

cerr您似乎想要对模板函数进行完全的专门化。为此,您需要在定义之前添加一个
模板
。@n314159,即使我不使用它?对于每个定义还是仅针对一个?什么是“内联”定义对我来说不是正确的方式,因为我需要只调用这些类型确切的意思是?您可以使用SFINAE/
std::enable_if
使模板有选择地可用于某些类型。@是的,您需要告诉编译器您希望专门化此函数,而不是以另一种方式重写它。@n314159谢谢,它起了作用!您似乎想要对模板函数进行完全专门化。为此您需要在定义之前添加一个
模板
。@n314159,即使我不使用它?对于每个定义还是仅用于一个?什么是“内联”定义对我来说不是正确的方式,因为我需要只能调用这些类型…”确切的意思是?您可以使用SFINAE/
std::enable_if
使模板有选择地可用于某些类型。@是的,您需要告诉编译器您希望专门化此函数,而不是以其他方式重写它。@n314159谢谢,它起作用了!
//Lib.h

#pragma once
#include "Enter.h"
#include <iostream>
#include <string>

template <typename T>
T method1(const std::string& = "", T = -1);

template <typename T>
T method2(const std::string& = "", T = -1);
//Lib.cpp

#include "pch.h"
#include "Lib.h"
using namespace std;

unsigned short method1(const string& text, unsigned short max)
{
    string ins;
    unsigned short val;

    while (true)
    {
        cout << text;
        getline(cin, ins);

        try
        {
            if (cin.fail()) cin.clear();
            val = stoi(ins);
            if (val > max) throw val;
        }
        catch (...)
        {
            cerr << "Risposta non valida!";
            Enter(2);
            continue;
        }

        break;
    }

    return val;
}
unsigned method1(const string& text, unsigned max)
{
    string ins;
    unsigned val;

    while (true)
    {
        cout << text;
        getline(cin, ins);

        try
        {
            if (cin.fail()) cin.clear();
            val = stoi(ins);
            if (val > max) throw val;
        }
        catch (...)
        {
            cerr << "Risposta non valida!";
            Enter(2);
            continue;
        }

        break;
    }

    return val;
}
unsigned long method1(const string& text, unsigned long max)
{
    string ins;
    unsigned long val;

    while (true)
    {
        cout << text;
        getline(cin, ins);

        try
        {
            if (cin.fail()) cin.clear();
            val = stoi(ins);
            if (val > max) throw val;
        }
        catch (...)
        {
            cerr << "Risposta non valida!";
            Enter(2);
            continue;
        }

        break;
    }

    return val;
}
unsigned long long method1(const string& text, unsigned long long max)
{
    string ins;
    unsigned long long val;

    while (true)
    {
        cout << text;
        getline(cin, ins);

        try
        {
            if (cin.fail()) cin.clear();
            val = stoi(ins);
            if (val > max) throw val;
        }
        catch (...)
        {
            cerr << "Risposta non valida!";
            Enter(2);
            continue;
        }

        break;
    }

    return val;
}

unsigned short method2(const string& text, unsigned short max)
{
    unsigned short val;

    while (true)
    {
        cout << text;
        if (cin >> val && val <= max) break;

        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cerr << "Risposta non valida!";
        Enter(2);
    }
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    return val;
}
unsigned method2(const string& text, unsigned max)
{
    unsigned val;

    while (true)
    {
        cout << text;
        if (cin >> val && val <= max) break;

        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cerr << "Risposta non valida!";
        Enter(2);
    }
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    return val;
}
unsigned long method2(const string& text, unsigned long max)
{
    unsigned long val;

    while (true)
    {
        cout << text;
        if (cin >> val && val <= max) break;

        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cerr << "Risposta non valida!";
        Enter(2);
    }
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    return val;
}
unsigned long long method2(const string& text, unsigned long long max)
{
    unsigned long long val;

    while (true)
    {
        cout << text;
        if (cin >> val && val <= max) break;

        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cerr << "Risposta non valida!";
        Enter(2);
    }
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    return val;
}
//main.cpp

#include <vector>
struct Client
{
    std::string name;
    unsigned short age;
};

int main()
{
    std::vector<Client> mylist;
    mylist.push_back({ temp, method2<unsigned short>("Insert age: ", 120) });
}