繁体   English   中英

C ++模板朋友功能未链接

[英]C++ template friend function not linking

我有以下在VC6中编译的代码:

Text.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给了我LINK错误:

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>.\Debug\UnitTestText.exe : fatal error LNK1120: 1 unresolved externals

如果我将代码放在Text.h中,则可以正常编译。 但是我不想这样做,因为我想使声明在执行时保持干净。 我不知道为什么函数在类之外时链接器在这种情况下会抱怨? 这是唯一的问题,该类很大,并且还有其他朋友函数返回CTextT。

当然,它确实会给出链接器错误。 您成为friendadd()函数不是函数模板! 它是在类模板内声明的非模板函数。 结果,您也将无法将此功能定义为模板。 您可以在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中,此代码将不再编译-将返回内部编译器错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM