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