Visual studio 2008 LNK2005-Visual Studio-以前编译过,没有更改,现在不编译 我正在用VisualC++编写一个数据结构学校的项目。今天早些时候,我把代码编译得很好,然后把它带回家,它就不再工作了。我一直在使用的两台机器都使用VisualStudio2008。下面是错误的文本
我不确定这是否与此有关,但我的程序有3个主要类:AVL,它继承自BST,它继承自SearchableADT。这些是模板类 BST.obj:错误LNK2005:“public:u thiscall BST,class std::allocator>>::BST,class std::allocator>>(void)”(?0$BST@V?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@@@QAE@XZ)已在AVL.obj中定义 我完全不知道该怎么办。我浏览了一些论坛,查看了MSDN页面,但没有任何东西能够修复它 我注意到在一个我忘记的网站上提到的一件事是为我的AVL定义了#ifndef/#。我创建了一个新的项目,复制并粘贴了我所有的代码,但是我仍然会遇到同样的错误。我已经检查了我的代码,以验证我没有执行多个包含库的操作。不过,我不知道从这里该怎么办 感谢您提供的任何帮助,如果我遗漏了一些重要的内容,请提前道歉 编辑:我不确定你所说的“内联”是什么意思,现在试着做一些查看。我有一个单独的cpp,在这里我定义了实际的函数。格雷格答案中的内联部分是否仍然适用 MSN,恐怕我不明白你的答案。至于默认构造函数的多个副本,我有Visual studio 2008 LNK2005-Visual Studio-以前编译过,没有更改,现在不编译 我正在用VisualC++编写一个数据结构学校的项目。今天早些时候,我把代码编译得很好,然后把它带回家,它就不再工作了。我一直在使用的两台机器都使用VisualStudio2008。下面是错误的文本,visual-studio-2008,Visual Studio 2008,我不确定这是否与此有关,但我的程序有3个主要类:AVL,它继承自BST,它继承自SearchableADT。这些是模板类 BST.obj:错误LNK2005:“public:u thiscall BST,class std::allocator>>::BST,class std::allocator>>(void)”(?0$BST@V?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@@@QAE@XZ)已在AVL.obj中定义 我完
BST<int>::BST()
{
root = new Node<int>;
}
BST<string>::BST()
{
root = new Node<string>;
}
BST::BST()
{
根=新节点;
}
BST::BST()
{
根=新节点;
}
我不确定这是否就是你所说的,或者这是否就是问题所在。我的头文件只有BST();,int或string模板没有任何内容。我在我的cpp中有这些定义,因为我的导师说它们对于模板化的类是必要的
非常感谢您内联声明BST::BST(void),并确保您没有违反一个定义规则,并且根据其他一些预处理器的乐趣使用不同的BST::BST(void)实现。听起来您可能以非内联方式在头文件中定义了一个方法。例如,在头文件中包含以下内容可能会导致此类问题:
template <class T> class Foo {
void bar();
};
template <class T> void Foo<T>::bar()
{
// ...
}
模板类Foo{
空心钢筋();
};
模板void Foo::bar()
{
// ...
}
在头文件中使用该函数,然后将其包含到两个不同的模块中,将为相同的Foo::bar()
函数提供两个不同的定义,以及由此产生的错误。一种解决方案是内联声明函数:
template <class T> class Foo {
void bar() {
// ...
}
}
模板类Foo{
空条(){
// ...
}
}
您没有为模板的每个实例化类型定义单独的构造函数。对于BST,您只需要一个构造函数。您可以使用模板参数创建节点类的实例:
root = new Node<T>();
root=新节点();