C++模板朋友函数未链接
C++ template friend function not linking
我有以下代码在VC6中编译:
文本.h:
template <typename T>
class CTextT
{
public:
friend CTextT add(const CTextT& text1, const CTextT& text2) ;
friend CTextT operator+(const CTextT& string1, const CTextT& string2)
{
return ::add(string1, string2);}
}
....................
};
在标题的末尾
#include "Text.inl"
Text.inl:
template <typename T>
CTextT<T> add(const CTextT<T>& text1, const CTextT<T>& text2)
{
CTextT<T> temp ;
// do something
return temp ;
}
但VC2010给我链接错误:
error LNK2019: unresolved external symbol "class CTextT<char> __cdecl add(class CTextT<char> const &,class CTextT<char> const &)" (?add@@YA?AV?$CTextT@D@@ABV1@0@Z)
referenced in function "class CTextT<char> __cdecl operator+(class CTextT<char> const &,class CTextT<char> const &)" (??H@YA?AV?$CTextT@D@@ABV0@0@Z)
1>.DebugUnitTestText.exe : fatal error LNK1120: 1 unresolved externals
如果我把代码放在Text.h中,它编译得很好。但我不想这样做,因为我想保持声明不被执行。我不明白为什么链接器在这种情况下抱怨函数在类之外?这是唯一的问题,并且类很大,还有其他返回CTextT的友元函数。
当然,它确实给出了一个链接器错误。您制作的friend
的add()
函数不是函数模板!它是在类模板中声明的非模板函数。因此,您也无法将此函数定义为模板。您可以在friend
声明中直接定义它。
另一种选择是在类模板之前声明函数模板。当然,这也需要类模板的声明。以下内容应该有效:
template <typename T> class CTextT;
template <typename T> CTextT<T> add(CTextT<T> const&, CTextT<T> const&);
template <typename T>
class CTextT
{
friend CTextT<T> add<>(CTextT<T> const&, CTextT<T> const&);
// ...
};
现在,您给出的模板定义应该可以工作了。
解决方案如下:
template <typename T>
class CTextT
{
public:
template <typename T>
friend CTextT<T> add(CTextT<T> const&, CTextT<T> const&) ;
friend CTextT<T> operator+(const CTextT<T>& string1, const CTextT<T>& string2)
{ return ::add(string1, string2); }
};
template <typename T>
CTextT<T> add(CTextT<T> const&, CTextT<T> const&)
{
CTextT<T> temp ;
return temp ;
}
我发现以下MSDN链接解释了如何在模板中添加好友函数-http://msdn.microsoft.com/en-us/library/f1b2td24.aspx.
我进行了测试,它适用于VS2010和VS2012。VC6不需要第二个模板声明(它从类中获取(,并且在VC6中,此代码将不再编译-将返回内部编译器错误。
相关文章:
- 内联函数中具有内部链接的全局变量
- 使用C链接在函数内部创建C++模板
- 返回一个带有 std::move 的对象并链接函数
- 无法使函数公开。获取:"LNK2005"错误。如何调试链接器错误
- 链接器错误:无法解析构造函数
- C++线程找不到函数作为参数(链接器)
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 构造函数的链接时间自动注册
- Doxygen:不为非成员函数生成超链接
- 静态库中的 g++ 错误链接函数
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- 仅当链接函数 C++ 时,才会发生"Expression must have class type error"
- 反向动态链接函数调用
- OpenGL GLX_EXT_swap_control存在,但无法链接函数
- C++哈希链接函数
- c++中对链接函数的未定义引用
- 在运行时用LD_PRELOAD链接函数
- C++标准是否规定C链接函数为“noexcept”
- 可以用不同的名称链接函数
- 共享库没有链接函数