我有这段代码:
头文件中的
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 ( .... ) ...
为什么吗
请解释一下,请告诉我未定义参考的含义
答案 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。