gpt4 book ai didi

c++ - 不能为 std::basic_string foo = "foo"推导出 T = char?

转载 作者:可可西里 更新时间:2023-11-01 16:15:23 25 4
gpt4 key购买 nike

问题:在下面的代码中,第一个示例的模板参数类型推导似乎失败了,但第二个示例却没有。我不明白为什么第一个样本无法推断出 T = char .我会认为 T"foo" 转换时可以推导出至 std::bacis_string<T> ,但即使这不起作用,我也提供了第二个函数参数,我认为它会明确约束 Tchar . 为什么它会失败?

Does not work :

#include <iostream>
#include <string>

template <typename T>
void print(const std::basic_string<T>& a, const std::basic_string<T>& b)
{
std::cout << a << b << std::endl;
}

int main()
{
std::string bar = "bar";
print("foo", bar);
}

错误:

string.cpp:14:5: error: no matching function for call to 'print'
print("foo", bar);
^~~~~
string.cpp:6:6: note: candidate template ignored: could not match
'basic_string<type-parameter-0-0, char_traits<type-parameter-0-0>,
allocator<type-parameter-0-0> >' against 'char const[4]'
void print(const std::basic_string<T>& a, const std::basic_string<T>& b)
^
1 error generated.

Works :

#include <iostream>
#include <string>

template <typename T>
void print(const std::basic_string<T>& a, const std::basic_string<T>& b)
{
std::cout << a << b << std::endl;
}

int main()
{
std::string foo = "foo";
std::string bar = "bar";
print(foo, bar);
}

最佳答案

问题是这里需要转换。推导T , 编译器必须检查 std::basic_string 的所有可能实例化并查看其中哪些可以由 const char* 构建(或者实际上是 const char (&)[4] )。这当然是不可能的,因为它们的数量是无限的。它必须检查所有而不能只扫描采用 const char* 的构造函数的主要模板定义的原因。或 const char(&)[4]对一些人来说是T , std::basic_string<T>可以部分或完全专门化,并且这些专门化的成员与主模板的成员没有关系。

关于c++ - 不能为 std::basic_string<T> foo = "foo"推导出 T = char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com