为什么不能将字符串文本传递给使用模板参数的函数?

Why can't you pass a string literal to a function that uses a template argument?

本文关键字:参数 函数 不能 字符串 文本 为什么      更新时间:2023-10-16
#include<iostream>
#include<string>
using namespace std;
template<typename T>
struct Node{
    T data;
    Node* left;
    Node* right;
    Node(T x) : data(x), left(NULL), right(NULL){}
};
template<typename T>
Node<T>* new_node(T x)
{
    Node<T>* return_node = new Node<T>(x);
    return return_node;
}
int main()
{
    Node<string>* root = new_node("hi"); //error!
    string x = "hi";
    Node<string>* root2 = new_node(x); //OK
}

为什么不能在括号内使用字符串文字?是否有任何简单的方法可以在不声明字符串然后创建节点的情况下完成相同的任务,或者这是唯一的方法?

T被推导为const char*,因此将返回Node<const char*>*,但你不能将其分配给Node<string>*

您可以创建临时:

new_node(std::string("hi"));

或者,您可以使用显式限定调用new_node

new_node<std::string>("hi");

为什么不能将字符串文本传递给使用模板参数的函数?

您可以,您没有正确阅读编译器错误消息。

这编译得很好:

new_node("hi");

但这不会:

Node<string>* root = new_node("hi"); //error!

因此,问题显然不是将字符串文本传递给模板函数。