请考虑以下事项。
class ClassA
{
public:
template <typename Fn>
int getTotal(Fn access);
void setId(std::string id, int index);
private:
std::string idVec[3];
};
template <typename Fn>
int ClassA::getTotal(Fn access)
{
int total = 0;
for (int i = 0; i < 3; i++)
{
total += access(idVec[i]).getValue();
}
return total;
}
void ClassA::setId(std::string id, int index)
{
idVec[index] = id;
}
class Unit
{
public:
Unit();
int getValue() const;
std::string GetId() const;
void setValue(int i);
void setId(std::string s);
private:
std::string id;
int value;
};
Unit::Unit()
{
value = 0;
id = "Not Set";
}
int Unit::getValue() const
{
return value;
}
std::string Unit::GetId() const
{
return id;
}
void Unit::setValue(int i)
{
value = i;
}
void Unit::setId(std::string s)
{
id = s;
}
Unit& accessTree(std::string id, BSTree<Unit> &tree)
{
Unit tempU;
tempU.setId(id);
return tree.search(tempU);
}
int main()
{
BSTree<Unit> tree;
auto getUnit = std::bind(accessTree, _1, std::ref(tree));
ClassA A;
Unit U1, U2, U3;
U1.setValue(1);
U2.setValue(2);
U3.setValue(3);
U1.setId("AAA111");
U2.setId("BBB222");
U3.setId("CCC333");
A.setId(U1.GetId(), 0);
A.setId(U2.GetId(), 1);
A.setId(U3.GetId(), 2);
tree.insert(U2);
tree.insert(U1);
tree.insert(U3);
int test = A.getTotal(getUnit); //LINE 50
std::cout << test << std::endl;
return 0;
}
链接到我的BSTree代码:
错误:
||=== Build: Debug in testMap (compiler: GNU GCC Compiler) ===|
include\BSTree.h||In member function 'elemType& BSTree<elemType>::search(const elemType&) const [with elemType = Unit]':|
include\BSTree.h|189|warning: control reaches end of non-void function [-Wreturn-type]|
obj\Debug\main.o||In function `main':|
E:\CODE\CGPP\Lab8\testMap\main.cpp|50|undefined reference to `int ClassA::getTotal<std::_Bind<Unit& (*(std::_Placeholder<1>, std::reference_wrapper<BSTree<Unit> >))(std::string, BSTree<Unit>&)> >(std::_Bind<Unit& (*(std::_Placeholder<1>, std::reference_wrapper<BSTree<Unit> >))(std::string, BSTree<Unit>&)>)'|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
所以这就是MCVE。不是100%肯定我做错了什么。
我错过了什么?
我的假设是与运行时定义的std :: bind有关(根据我的理解),这对我的程序需求来说已经太晚了。
感谢您提供的所有帮助,现在已经开展了几天的工作。