C++ 为什么传递给模板函数的std::string对象不喜欢std::string重载?

C++ 为什么传递给模板函数的std::string对象不喜欢std::string重载?,c++,c++11,C++,C++11,我正在编写一个程序,我希望能够干净地将字符串用引号括起来,而无需执行以下操作 std::string firstString = "This is a string"; std::string myString = "\"" + firstString + "\""; 因此,我编写了两个模板函数来获取它们的参数,并将它们用引号括起来。我还介绍了我第一次(天真地)尝试编写一个通用的toString()函数(我知道要使用字符串,但我这样做也是为了学习) 当然,一个简单得多的toString

我正在编写一个程序,我希望能够干净地将字符串用引号括起来,而无需执行以下操作

std::string firstString = "This is a string";
std::string myString = "\"" + firstString + "\"";    
因此,我编写了两个模板函数来获取它们的参数,并将它们用引号括起来。我还介绍了我第一次(天真地)尝试编写一个通用的toString()函数(我知道要使用字符串,但我这样做也是为了学习)

当然,一个简单得多的toString()方法将执行基本检查,以查看参数是否为std::string,如果为std::string,则返回该参数。std::stringstream在遇到字符串中的第一个空格时(因此是截断的输出),似乎会停止。然而,这并不是我困惑的主要焦点


很抱歉问了一个很基本的问题,但这个问题真的让我难堪。感谢您提供的帮助。

您没有正确地专门化模板功能。以下是如何正确地专门化它:

template<>
std::string tQuoted(const std::string &convert)
{
    std::cout << "Called std::string overload" << std::endl;
    return ("\"" + convert + "\"");
}
请注意,对于

tQuoted(mySuperPtr) 

mySuperPtr
是指向字符串的指针,而不是字符串,因此它不使用专门的模板函数。

请仔细查看您编写的此函数模板:

template<typename T>
std::string tQuoted(const std::string &convert)
{
    std::cout << "Called std::string overload" << std::endl;
    return ("\"" + convert + "\"");
}
无需
模板
。其他重载也是如此——它们都是带有非推断上下文模板参数的函数模板


避免函数模板专门化,除非您确实需要它们。在这种情况下,你不会。请参见

现实世界代码的最快解决方案:改用单个非模板重载
std::string tQuoted(const std::string&convert)
。不管怎样,函数模板专门化都很奇怪;请参阅示例。模板重载中没有依赖于模板参数的内容,因此编译器无法推断参数,因此不会实例化它们。@BaummitAugen由于此问题标记为C++11,我认为最好按值获取参数,而不是常量引用。这里没有使用函数模板专门化的理由。这就像有人发布
int*i=newint(7);标准::cout
Called std::string overload
"Hello"
Called std::string overload
"30 Days Of Coding"
Called std::string overload
"All Work And No Play"
Called std::string overload
"Hello, World!"
Called std::string overload
"Hello, World!"
Called template overload
"0x1c27d10"
Called std::string overload
"Another string"
tQuoted(mySuperPtr) 
template<typename T>
std::string tQuoted(const std::string &convert)
{
    std::cout << "Called std::string overload" << std::endl;
    return ("\"" + convert + "\"");
}
std::string tQuoted(const std::string &convert)
{
    std::cout << "Called std::string overload" << std::endl;
    return ("\"" + convert + "\"");
}