LNK2005 - Visual Studio - 在编译之前编译,没有更改,现在不编译

时间:2009-02-27 03:01:46

标签: visual-studio-2008

我正在开发一个带有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中有这些定义,因为我的导师说他们对于模板化的课程是必要的。

非常感谢

3 个答案:

答案 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)实现,具体取决于其他一些预处理器的乐趣。