我试图在这里编译Boost Calc6示例:
http://www.boost.org/doc/libs/1_46_1/libs/spirit/example/qi/calc6/
通常情况下,使用Xcode在我的Mac上顺利完成。目前,我在使用VS2013的PC上。我在创建Win32控制台应用程序时为标准设置添加了一些内容。通常情况下,它会为您设置ProjectTitle.cpp和stdafx.cpp(它只有#include" stdafx.h"在里面)。
这是包含" main"的文件。在Calc示例中看起来像
RadioGroup[] answerGroup;
RadioButton[] answer;
Button finishButton;
RadioButton[] checkedRadioButton;
ArrayList<RadioButton> correctAnswerRadios;
ArrayList<RadioButton> wrongAnswersRadios;
correctAnswerRadios = new ArrayList<>();
wrongAnswersRadios = new ArrayList<>();
answerGroup = new RadioGroup[5];
answer = new RadioButton[4];
int i = 0;
for (Question qn : questions) {
answerGroup[i] = new RadioGroup(this);
int j = 0;
for (Answer an : answers) {
if (qn.getID() == an.getQuestion_id_answer()) {
answer[j] = new RadioButton(this);
answer[j].setText(an.getAnswer());
answer[j].setId(j + 100);
answer[j].setTag(String.valueOf(an.getCorrect_answer()));
answerGroup[i].addView(answer[j]);
answer[j].setOnClickListener(new View.OnClickListener() {
private boolean isChecked = true;
@Override
public void onClick(View v) {
for (int j = 0; j < answer.length; j++) {
checkedRadioButton[j] = ((RadioButton) v);
int CorrectAnswer = Integer.parseInt(checkedRadioButton[j].getTag().toString());
if (checkedRadioButton[j].isChecked() & CorrectAnswer == 1) {
correctAnswerRadios.add(checkedRadioButton[j]);
} else {
wrongAnswersRadios.add(checkedRadioButton[j]);
}
}
}
});
j++;
}
}
linearLayout.addView(answerGroup[i]);
i++;
}
finishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < answerGroup.length; i++) {
for (int j = 0; j < answer.length; j++) {
RadioButton correctRadio = correctAnswerRadios.get(j);
correctRadio.setTextColor(Color.GREEN);
RadioButton wrongRadio = wrongAnswersRadios.get(j);
wrongRadio.setTextColor(Color.RED);
answerGroup[i].getChildAt(j).setEnabled(false);
}
}
}
});
注意到我添加了
#include "calc6.hpp"
#include "stdafx.h" /* I ADDED THIS, AS IT COMES AS BOILERPLATE WITH VS PROJECT
template <typename Grammar>
bool compile(Grammar const& calc, std::string const& expr)
{
using ascii::space;
std::string::const_iterator iter = expr.begin();
std::string::const_iterator end = expr.end();
bool r = phrase_parse(iter, end, calc, space);
if (r && iter == end)
{
std::cout << "-------------------------\n";
std::cout << "Parsing succeeded\n";
std::cout << "-------------------------\n";
return true;
}
else
{
std::cout << "-------------------------\n";
std::cout << "Parsing failed\n";
std::cout << "-------------------------\n";
return false;
}
}
struct var_printer
{
var_printer(std::vector<int> const& stack)
: stack(stack)
{
}
template <typename String, typename Data>
void operator()(String const& s, Data const& data)
{
std::cout << " " << s << ": " << stack[data] << std::endl;
}
std::vector<int> const& stack;
};
int
_tmain() // I CHANGED THIS FROM MAIN TO _TMAIN
{
std::cout << "/////////////////////////////////////////////////////////\n\n";
std::cout << "Expression parser...\n\n";
std::cout << "/////////////////////////////////////////////////////////\n\n";
std::cout << "Type some statements... ";
std::cout << "Then type period ('.') to compile, run and print results\n\n";
typedef std::string::const_iterator iterator_type;
typedef statement<iterator_type> statement;
vmachine mach; // Our virtual machine
std::vector<int> code; // Our VM code
statement calc(code); // Our grammar
std::string str;
std::string program;
while (std::getline(std::cin, str))
{
if (str.empty() || str[0] == '.')
break;
program += str;
}
if (::compile(calc, program))
{
mach.execute(code, calc.nvars);
std::cout << "Results------------------\n\n";
calc.vars.for_each(var_printer(mach.get_stack()));
std::cout << "-------------------------\n\n";
}
std::cout << "Bye... :-) \n\n";
return 0;
}
并将main更改为
#include "stdafx.h"
所有其他.cpp和.hpp文件完全按原样复制。在这一点上,我得到:(为错误的错误信息编辑道歉)
_tmain()
当我取消注释时
Error 4 error LNK2019: unresolved external symbol "public: __thiscall
statement<class std::_String_const_iterator<class std::_String_val<struct
std::_Simple_types<char> > > >::statement<class
std::_String_const_iterator<class std::_String_val<struct
std::_Simple_types<char> > > >(class std::vector<int,class
std::allocator<int> > &)"
(??0?$statement@V?$_String_const_iterator@V
$_String_val@U?$_Simple_types@D@std@@@std@@@std@@@@QAE@AAV?$vector@HV
$allocator@H@std@@@std@@@Z)
referenced in function _wmain
c:\Users\housegroup\documents\visual studio2013\Projects\example\example\calc6.obj example
_tmain()中的。否则,它至少在我注释时编译(例如,如果我将所有_tmain()留空。
请帮助,我几乎从不使用Visual Studio :(
答案 0 :(得分:0)
删除所有头文件并将其重新添加到Header Files文件夹中。以前,我在Source Files文件夹中拥有它。