在我的课堂上,我得到了:
template<class T> void Swap(T, T);
在class.cpp中:
template<class T>
void class::Swap(T& p1, T& p2)
{
T aux = p1;
p1 = p2;
p2 = aux;
}
当我尝试:
this->Swap<char*>(&lit[i][k], &lit[i][l]);
另一个问题: 我在这里做错了什么:我想在一些定界符(“+ - ”)之后拆分我的字符串,并且strtok没有像我预期的那样工作。
int counter = 0;
char* s = strtok(eq_clone ," ");
while(s != NULL)
{
counter++;
if(s == "")
counter--;
s = strtok(eq_clone ,"+-");
}
答案 0 :(得分:3)
这看起来像是一个错误,因为它永远不会成真:
if(s == "")
这是将s
的地址与字符串文字""
的地址进行比较:它不检查s
是否为空字符串。使用strtok()
的替代方法是boost::algorithm::split
:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
int main()
{
std::string s("a,string+with-multiple delimiters");
std::vector<std::string> s_tokens;
boost::algorithm::split(s_tokens, s, boost::is_any_of(",+- "));
std::for_each(s_tokens.begin(),
s_tokens.end(),
[] (const std::string& s)
{
std::cout << s << "\n";
});
return 0;
}
输出:
a
string
with
multiple
delimiters
关于交换,正如在评论和其他答案中已经说明的那样,只需使用std::swap()
。我猜测lit
是char[][]
,因此std::swap(lit[i][k], lit[i][l]);
将完全符合您的要求。
编辑:
评论后发出声明string* lit
并且lit
似乎是一个数组(来自示例用法),然后以这种方式使用std::swap()
:
std::string* lit = new std::string[4];
lit[0] = "zero";
std::swap(lit[0][1], lit[0][2]); // The characters will be passed by reference,
// don't take address.
std::cout << lit[0] << "\n"; // Prints "zreo"
请注意,Swap()
的声明按值传递参数(不正确),但Swap()
的定义通过引用传递参数(正确)。如果您更改Swap()
的声明并按如下方式调用它,它将起作用(如果您真的不想使用std::swap()
:
template<class T> void Swap(T&, T&);
//^ //^
Swap(lit[i][k], lit[i][l]);
答案 1 :(得分:1)
1)为什么Swap()
是班级成员?类成员应该以某种方式紧密耦合到您的类。在大多数情况下,如果不使用私人成员或非常类似于某种方法(即一种方便的方法)的某些东西成为集体成员,那么它就是糟糕设计的标志。 C ++不是java,其中所有东西都必须属于一个类。使您的swap()
方法成为一种独立的模板方法。
2)更好的是,不要重新发明轮子。 std::swap()
就在那里,而且效果很好。在许多情况下,您可以期望标准库提供的方法和类比您可以编写的内容更好地工作。
3)在您的班级中,您调用了方法Sort()
,但问题是Swap()
。既然你没有写下你期望发生的事情以及实际发生的事情,那么这是我唯一能找到的可能是错误的事情。
4)除非必须,否则不要在C ++中使用strtok()
。 char*
是C-Style字符串,不应在C ++中使用。请改用std::string
。