1

我在链接 C++ 项目时遇到问题,我不知道出了什么问题。代码的笑话。

clitest.cpp

#include <iostream>
#include "node.h"
using namespace std;

int main(int argc, char** argv)
{
    node<int> *ndNew = new node<int>(7);
    return 0;
}

节点.h

#ifndef NODE_H
#define NODE_H
#include <vector>

template <typename T>
class node
{
    private:
        node<T>* ndFather;
        std::vector<node<T>* > vecSons;
    public:
        T* Data;
        node(const T &Data);
};
#endif

节点.cpp

#include "node.h"

using namespace std;

template <typename T>
node<T>::node(const T &Data)
{
    this->Data = &Data;
    this->ndFather = 0;
    this->vecSons = (new vector<T>());
};

使用的编译器命令是

g++ -Wall -g clitest.cpp node.cpp -o clitest

错误日志是这样的

clitest.cpp: In function ‘int main(int, char**)’:
clitest.cpp:8:16: warning: unused variable ‘ndNew’ [-Wunused-variable]
     node<int> *ndNew = new node<int>(7);
                ^
/tmp/cc258ryG.o: In function `main':
clitest.cpp:8: undefined reference to `node<int>::node(int const&)'
collect2: error: ld returned 1 exit status
make: *** [blist] Error 1

我花了相当多的时间来移动代码,试图找出问题,我要么错过了一些基本的东西,要么是我不知道 C++ 链接的东西。

4

2 回答 2

0

在 .cpp 文件之前使用-I.,以便编译器知道要查找 .h 文件。

g++ -Wall -I. clitest.cpp node.cpp -o clitest

或者只是-I

g++ -Wall -I clitest.cpp node.cpp -o clitest
于 2013-05-14T19:08:33.713 回答
0

使用模板时,编译器需要知道在实例化类时如何为类生成代码。未定义引用错误是因为编译器没有生成node<int>::node(int const &)构造函数。见,例如为什么模板只能在头文件中实现?

你有几个选择:

  1. 将实现放在 node.h 中(node.cpp 被删除,因为它不需要)
  2. 将实现放在 node.h 底部的 #included 文件中(通常该文件称为 node.tpp)

我建议将实现放在 node.h 中并删除 node.cpp。请注意,您示例中的代码不是有效的 c++:成员变量 vecSons 不是指针,因此该行将vecSons = new vector<T>()给出编译器错误。以下代码可能是完整实现的起点:

#ifndef NODE_H
#define NODE_H
#include <vector>

template <typename T>
class node
{
    private:
        node<T>* ndFather;
        std::vector<node<T>* > vecSons;
    public:
        const T* Data;
        node(const T &d) : 
            ndFather(0),
            vecSons(),
            Data(&d)
        {
        }
};
#endif
于 2013-05-15T03:30:28.587 回答