这个C ++函数模板调用有什么问题?

时间:2013-12-22 02:55:16

标签: c++ templates

bmd2fileio.h

内的声明
class bmd2File {
  public:
    template <typename T>
    void write(const T & t) const throw (bmd2Exception);

bmd2fileio.cpp

内的定义
#include "bmd2fileio.h"

...

template <typename T>
void bmd2File::write(const T & t) const throw (bmd2Exception)
{
  #ifdef _WIN32

    LPDWORD lpNumberOfBytesWritten;
    bool written = WriteFile(this->handle,
                              t,
                              sizeof(T),
                              lpNumberOfBytesWritten,
                              0);

    if (!written)
    {
      printf("Not written.");
    } else {
      printf("Written.");
    }

  #else

  #endif

}

main.cpp 内的(失败)调用:

#include "bmd2fileio.h"

...

const std::string data = "meow";

std::auto_ptr<bmd2File> myBmdFile(new bmd2File(fileName));

myBmdFile->write(data);

它不会链接以下错误:

undefined reference to `bmd2File::write(std::string const&) const'

我认为这将解析为std :: string,以便链接器可以很好地找到我的函数......但事实并非如此。卫生署!

2 个答案:

答案 0 :(得分:1)

您发布的错误是所谓的链接器错误,这意味着该函数未定义。所以,你走了:你的功能是未定义的。这就是它的错误。

在这种情况下,典型的初学者错误是将定义放在.cpp文件中。不要将模板函数的定义放在.cpp文件中。模板函数通常应在头文件中定义 - 包含其声明的相同文件。

答案 1 :(得分:1)

您发布的代码仅包含声明。您得到的错误表明您缺少write()函数的[可见]定义。基于以上内容,您需要定义write()

template <typename T>
void write(const T & t) const throw (bmd2Exception) {
    // you implementation goes here
}

您可能已在实例化不可见的翻译单元中定义了您的功能,在这种情况下,您的问题为already answered

BTW,抛出除了空规范之外的规范(声明该函数不允许抛出)对于任何类型的通用代码都是一个坏主意:你有没有的想法什么样的异常通用代码可能需要抛出。