为什么编译器提供未定义的引用

时间:2011-03-18 06:25:12

标签: c++

我有这段代码:

头文件中的

     class SocialNet {
         private:
               // some data 
         public:
               // some other operations

          template <typename T, typename V> 
            T find(V identifier, const vector<T>& objects) const;   
      };

在.cpp文件中

  // in that file, I haven't use that function
  // I have four other template functions used in that header, and compiler have 
  //not   give any error 
    template <typename T, typename V> 
    T find(V identifier, const vector<T>& objects) const {

         // some things to do required job
     }

在main.cpp

// I have used that function, for the first time in that file

当我编译时,我有以下错误;

/main.cpp .. undefined reference to SocialNet :: find ( ....  ) ...

为什么吗

请解释一下,请告诉我未定义参考的含义

4 个答案:

答案 0 :(得分:3)

您无法在.cpp文件中实现模板,find的函数定义应该在头文件中。有关详细信息,请参阅此常见问题解答Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?

答案 1 :(得分:3)

在定义SocialNet::

时忘了写find
template <typename T, typename V> 
T SocialNet::find(V identifier, const vector<T>& objects) const {
//^^^^^^^^^^^ note this!

 }

SocialNet::告诉编译器函数find是SocialNet类的成员函数。在没有SocialNet::的情况下,编译器会将find视为自由函数!

答案 2 :(得分:0)

您在T find(...)定义之前缺少类名。

template <typename T, typename V> 
T SocialNet :: find(V identifier, const vector<T>& objects) const {

     // some things to do required job
}  

您需要在SocialNet之前放置find(...),因为find(...)在类SocialNet的范围内声明。由于定义了类声明范围之外的功能,因此需要明确提到所定义的方法属于类SoicalNet。请注意,::是范围解析运算符。此外,您需要在源文件SocialNet.cpp中包含标题。

答案 3 :(得分:0)

您没有调整您的功能范围。也就是说,你没有在你的类名和范围操作符(在本例中为SocialNet::)开头。

在类本身之外实现函数时,必须调整函数的范围以使其正常工作,以便编译器知道它正在编译哪个函数(即两个类可以有两个不同的函数,具有相同的名称)。

undefined reference错误来自编译器,当你在一个类中声明了一个函数但没有实现它时(你需要{}个大括号来实现一个什么都不做的void函数;一个半-colon签名后纯粹是宣言)

的问候,
丹尼斯M。