无法从字符串转换为模板 C2664

卡布09

我创建了List(一个带有模板的类),它的构造函数接收一个 value T我正在尝试在switch名为Menu(也使用模板)的类的a设置该类型的值当我尝试运行Menu.run()除字符串之外的所有开关选项时。

错误是

错误 C2664“List<T>::List(const List<T> &)”:无法将参数 1 从“const char [2]”转换为“T”

//Class List

template <class T>
class List {
public:
List(T value) {
        this->head = nullptr;
        this->tail = nullptr;
        this->value = value;
        this->name = "no name";
    }
protected:
    List* head;
    List* tail;
    T value;
    std::string name;

};
//Class Menu
template<typename T>
class Menu{
public:
    Menu(int dataType) {
        this->dataType = dataType;
    }

    void run(){
        std::map<std::string, List< T > * > list;               
        List< T >* list1 = new List< T >("Test");
        std::cout << list1->toString() << std::endl;
    }
int main(){
    int dataType = 1;
    if (dataType == 1) {
        Menu <std::string> c(dataType);
        c.run();        
    }else if (dataType == 2) {
        Menu <int> c(dataType);
        c.run();
    }else if (dataType == 3) {
        Menu<double> c(dataType);
        c.run();
    }else if (dataType == 4) {
        Menu<char> c(dataType);
        c.run();
    }
    return 0;
}
艾伦·伯特尔斯

在您的main函数中,编译器必须编译您的所有代码。即使它稍后会优化它,因为它可以看到dataType == 1c++ 标准说它必须首先为所有数据类型生成代码。

您可以通过使用来解决这个问题,if constexpr以便编译器只编译实际使用的代码:

int main(){
    const int dataType = 1;
    if constexpr (dataType == 1) {
        Menu <std::string> c(dataType);
        c.run();        
    }else if (dataType == 2) {
        Menu <int> c(dataType);
        c.run();
    }else if (dataType == 3) {
        Menu<double> c(dataType);
        c.run();
    }else if (dataType == 4) {
        Menu<char> c(dataType);
        c.run();
    }
    return 0;
}

听起来这实际上并不是您想要的。正确的解决方案是修复导致故障的线路:

List< T >* list1 = new List< T >("Test");

这仅在Tis时有效std::string如果你用更通用的东西替换它,那么你的代码就会编译。您可以使用默认构造值:

List< T >* list1 = new List< T >(T{});

或者更有可能您的任务要求您从控制台读取值:

T value;
while (!(std::cin >> value))
{
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cout << "invalid value\n";
}
List< T >* list1 = new List< T >(value);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

需要帮助解决错误C2664

C ++-错误C2664:'int scanf(const char *,...)':无法将参数1从'int'转换为'const char *'

从#define转换为字符串c ++

C ++ c2664错误“无法将参数1从std :: string转换为_Elem *”

C#错误CS1503参数1:无法从“字符串”转换为“字符”

C2664无法转换为&&值

错误C2664'HRESULT IUnknown :: QueryInterface(const IID&,void **)':无法将参数1从'const winrt :: guid'转换为'const IID&'

错误C2664:MessageBoxW无法将参数2从'const char'转换为'LPCWSTR'

C#utf字符串转换,无法正确显示的字符被转换为“未知字符”-如何防止这种情况?

C2664无法将参数1从'int'转换为'hwnd'

字符串转换为C#

错误C2664:'print_result':无法将参数1从'int(__cdecl *)(int,int,int)'转换为'int'

错误C2664:“ errno_t strcpy_s(char *,rsize_t,const char *)”:无法将参数2从“ char [512]”转换为“ rsize_t”

使用不同的枚举参数时,VC ++函数模板实例化错误C2664

错误C2664:无法将“ IDWriteFactory2 **”转换为“ IUnknown **”

错误C2664:“ LoadLibraryA”:无法将参数1从“ WCHAR *”转换为“ LPCSTR”

Visual Studio OpenCV错误C2664

无法在C#soap调用中将类型字符串隐式转换为string []

错误C2664:“策略::中间阶段”:无法将参数2从“字符*”转换为“字符* []”

C#winforms参数1:无法从“字符串”转换为“ int”

在视觉工作室中获取错误:错误C2664:'_chmod':无法将参数1从'wchar_t [260]'转换为'const char *'

C++中构造模板函数时编译错误C2664和C2440

VS2017 C++编译错误C2664无法转换参数

C# 无法将类型转换为字符串

错误 C2664“BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)”:无法将参数 4 从“std::unique_ptr”转换为“LPWSTR”

无法在 C# 中将字符串转换为 DateTime

无法在 C++ 中将字符串转换为字符?

C++ 双向链表错误 C2664 'object1::object1(object1 &&)':无法将参数 1 从 'int' 转换为 'const object1 &'

C++:无法将字符串转换为 char*?