声明并实现函数后,main 仍然找不到函数 [duplicate]

After declaring and implementing the function, main still cannot find the function [duplicate]

提问人:J AVENTADOR 提问时间:10/30/2023 最后编辑:MSaltersJ AVENTADOR 更新时间:10/30/2023 访问量:67

问:

当我在 main 函数中声明、实现和调用函数时,我的编译器仍然报告外部符号无法解决的错误;我所有的代码都如下;问题详细信息介于“*”之间。

具体的错误语句是:

1.LNK2019   无法解析的外部符号 "void __cdecl CreateBinaryTree(void)" (?CreateBinaryTree@@YAXXZ),函数 main 中引用了该符号  DataStructure   C:\Users\lenovo\Desktop\Code\Visual、Studio\DataStructure\BinaryTree.obj 
2.LNK2019   无法解析的外部符号 "void __cdecl ShowBinaryTree(void)" (?ShowBinaryTree@@YAXXZ),函数 main 中引用了该符号  DataStructure   C:\Users\lenovo\Desktop\Code\Visual Studio\DataStructure\BinaryTree.obj 
3.LNK2019   无法解析的外部符号 "void __cdecl InsertInOrderThreadTree(void)" (?InsertInOrderThreadTree@@YAXXZ),函数 main 中引用了该符号    DataStructure   C:\Users\lenovo\Desktop\Code\Visual Studio\DataStructure\BinaryTree.obj 1   
4.LNK2019   无法解析的外部符号 "void __cdecl InOrderThreadTree(void)" (?InOrderThreadTree@@YAXXZ),函数 main 中引用了该符号    DataStructure   C:\Users\lenovo\Desktop\Code\Visual Studio\DataStructure\BinaryTree.obj 
5.LNK2019   无法解析的外部符号 "void __cdecl Traversal(void)" (?Traversal@@YAXXZ),函数 main 中引用了该符号    DataStructure   C:\Users\lenovo\Desktop\Code\Visual Studio\DataStructure\BinaryTree.obj 1   
#include<bits/stdc++.h>
using namespace std;
#define MaxSize 100

template<class T>
struct LinkNode {
    //implement
};

template<class T>
struct ThreadNode {
    //implement
};

template<class T>
struct TreeNode {
    //implement
};

template<class T>
class MyStack {
        //implement
};

template<class T>
LinkNode<T>* root;
template<class T>
ThreadNode<T>* threadNode;

//*************************************************************************************
void CreateBinaryTree();
void ShowBinaryTree();
void InsertInOrderThreadTree();
void InOrderThreadTree();
void InsertInOrderThreadTree();
void Traversal();

int main() {
    CreateBinaryTree();
    ShowBinaryTree();
    Traversal();
    InsertInOrderThreadTree();
    InOrderThreadTree();
}
//*************************************************************************************

//选择遍历方式
template<class T>
void Traversal() {
    //implement
}

//RecursiveTraversal
template<class T>
void preOrder(LinkNode<T>* p) {
    //implement
}

template<class T>
void inOrder(LinkNode<T>* p) {
    //implement
}

template<class T>
void postOrder(LinkNode<T>* p) {
    //implement
}

//nonRecursiveTraversal
template<class T>
void nonRecursivePreOrder(LinkNode<T>* p) {
    //implement
}

template<class T>
void nonRecursiveInOrder(LinkNode<T>* p) {
    //implement
}

template<class T>
void nonRecursivePostOrder(LinkNode<T>* p) {
    //implement
}

template<class T>
void InThread(ThreadNode<T>*& p,ThreadNode<T>*& pre) {
    //implement
}

template<class T>
void InOrderThreadTree() {
    //implement
}

template<class T>
void InsertInOrderThreadTree() {
    //implement
    
}

template<class T>
void CreateBinaryTree() {
    //implement
}

template<class T>
void ShowBinaryTree() {
    //implement
}


我希望有人能回答我的问题。我将不胜感激。

C++ 函数 模板

评论

1赞 Yksisarvinen 10/30/2023
可能是“为什么只能在头文件中实现模板?”的副本,但不清楚非模板声明在这里应该做什么,以及哪个文件与其他文件是分开的。
0赞 molbdnilo 10/30/2023
确实没有非模板定义。您已经声明了非模板函数,然后定义了函数模板。
0赞 user12002570 10/30/2023
声明是非模板声明,而您已将其定义为模板void CreateBinaryTree();template<class T> void CreateBinaryTree() { //implement }
2赞 Friedrich 10/30/2023
仅供参考,为什么我不应该 #include < bits/stdc++.h>

答:

3赞 user12002570 10/30/2023 #1

问题在于,您已将函数声明为非模板,但将它们定义/实现模板

为了解决这个问题,您可以将这些函数的定义更改为非模板化,如下所示。

//made this non-template by removing template<T>
void InOrderThreadTree() {
    //implement
}

//made this non template
void InsertInOrderThreadTree() {
    //implement
    
}

//made this definition non template
void CreateBinaryTree() {
    //implement
}

工作演示


另外,为什么我不应该 #include < bits/stdc++.h>