2011-11-28 1285 views
2

我有一个程序,它使用randomCharacter函数和随机字符串,使用randomString函数生成一个随机字符。后者利用前者,并且breedWithMutation使用randomCharacter来概率地突变基因序列的表示。从'char'到'const char *'的转换无效

#include <ctime> 
#include <boost/random.hpp> 

typedef boost::mt19937 randAlgorithm; 

int mutationsPerGeneration = 100; 
double probabilityOfMutation = 0.05; 
string potentialAlleles = "abcdefghijklmnopqrstuvwxyz "; 
size_t numberOfAlleles = potentialAlleles.size(); 

double random01(randAlgorithm & engine) 
{ 
    boost::uniform_real<double> u01; 
    return u01(engine); 
} 

int randomInteger(randAlgorithm & engine, size_t min, size_t max) { 
    boost::uniform_int<> minmax(min, max); 
    return minmax(engine); 
} 

string randomCharacter(randAlgorithm & engine, string charSet, size_t charSetSize) { 
    return charSet[randomInteger(engine, 0, charSetSize)]; 
} 

string randomString(randAlgorithm & engine, size_t length, string charSet, size_t charSetSize) { 
    string s; 
    s.reserve(length); 
    for (int i = 0; i < length; i++) { 
    s.append(randomCharacter(engine, charSet, charSetSize)); 
    } 
    return s; 
} 

string breedWithMutation(randAlgorithm & engine, string originalGenome, size_t genomeSize) { 
    string mutatedGenome; 
    mutatedGenome.reserve(genomeSize); 
    double mutationDraw; 
    for (size_t i = 0; i < genomeSize; i++) { 
    mutationDraw = random01(engine); 
    if (mutationDraw < probabilityOfMutation) { //The allele undergoes mutation 
     mutatedGenome.append(randomCharacter(engine, potentialAlleles, numberOfAlleles)); 
    } 
    else { 
     mutatedGenome.append(originalGenome[i]); 
    } 
    } 
    return mutatedGenome; 
} 

然而,当我构建应用程序,我得到这些错误:在错误

main.cpp: In function ‘std::string randomCharacter(randAlgorithm&, std::string, size_t)’: 
main.cpp:31:55: error: invalid conversion from ‘char’ to ‘const char*’ 
main.cpp:31:55: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ 
main.cpp: In function ‘std::string breedWithMutation(randAlgorithm&, std::string, size_t)’: 
main.cpp:53:45: error: invalid conversion from ‘char’ to ‘const char*’ 
main.cpp:53:45: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ 

行号并不完全排队,我知道,但前两个错误指randomCharacter中的唯一行,第三个和第四个错误参考此行:mutatedGenome.append(originalGenome[i]); in breedWithMutation。什么导致了这个错误?

回答

4

在C++中,charstring是明显不同的类型。不能将char值隐式转换为string(正如您在randomCharacter中试图做的那样)。

您可以将randomCharacter的返回类型更改为char而不是string,尽管这可能需要在其他地方也进行更改(我没有详细查看您的代码)。

+0

就我而言,这是一个很差的函数名称选择。我可以将一个'char'追加到'string'吗?我意识到他们是明显不同的类型;我像我一样命名了'randomCharacter',因为它只返回一个字母(从外行人的角度来看,而不是C++的意思)。 等待,'string [index]'返回一个'char'或'string'类型吗?这是问题吗? –

+0

@pythonscript'string [index]'的返回类型是char。这确实会导致你的问题。 – fefe

1

将退货类型randomCharacter()更改为char

1

这不是一个无效转化为const char这是一个无效转换const char*纯C中的字符串只是字符数组,或const char* s。所以,你正在使用一个字符,你应该使用一个字符串。

要检查一个实例:您已设置randomCharacter()以返回C++字符串,但实际上,您试图从charSet返回单个字符。对我来说,让你的函数返回char更有意义,但这是你做出的决定。

+0

谢谢;我相应地更新了这篇文章的标题。 –

相关问题