为文字字符串重载函数的问题
Problem with overloading a function for literal strings
我有一个处理右值参数的模板函数。该参数应该公开一个 certian 函数。对于那些没有这个功能的右值,我需要使用模板特化来处理异常。我遇到的问题是字符串文字。这是我正在尝试做的一个简短示例。
#include <iostream>
#include <string>
using namespace std;
struct A
{
template < class T > void foo (T && x)
{
x.baa();
}
};
struct B{
void baa(){
cout << "I have baa()" << endl;
};
};
template <> void
A::foo (std::string && x)
{
cout << "I am a std::string, I don't have baa()" << endl;
};
template <> void
A::foo (char *&&x)
{
cout << "I am a char* and I am sad because nobody ever calls me" << endl;
};
int
main ()
{
A a;
a.foo (B());
a.foo (std::string ("test1"));
a.foo ("test2"); // this line causes a compiler error
return 0;
}
如果我尝试编译上面的代码片段,我会收到以下错误
main.cpp:16:7: error: request for member ‘baa’ in ‘x’, which is of non-class type ‘const char [6]’
16 | x.baa();
显然,编译器正在尝试应用通用函数而不是 char* 的特化。我如何编写捕获任意长度文字字符串的专业化?
请注意,"test2"
文字是一个左值,而 char *&&x
是一个右值引用,不能绑定到左值。
我有一个处理右值参数的模板函数。该参数应该公开一个 certian 函数。对于那些没有这个功能的右值,我需要使用模板特化来处理异常。我遇到的问题是字符串文字。这是我正在尝试做的一个简短示例。
#include <iostream>
#include <string>
using namespace std;
struct A
{
template < class T > void foo (T && x)
{
x.baa();
}
};
struct B{
void baa(){
cout << "I have baa()" << endl;
};
};
template <> void
A::foo (std::string && x)
{
cout << "I am a std::string, I don't have baa()" << endl;
};
template <> void
A::foo (char *&&x)
{
cout << "I am a char* and I am sad because nobody ever calls me" << endl;
};
int
main ()
{
A a;
a.foo (B());
a.foo (std::string ("test1"));
a.foo ("test2"); // this line causes a compiler error
return 0;
}
如果我尝试编译上面的代码片段,我会收到以下错误
main.cpp:16:7: error: request for member ‘baa’ in ‘x’, which is of non-class type ‘const char [6]’
16 | x.baa();
显然,编译器正在尝试应用通用函数而不是 char* 的特化。我如何编写捕获任意长度文字字符串的专业化?
请注意,"test2"
文字是一个左值,而 char *&&x
是一个右值引用,不能绑定到左值。