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,以便链接器可以很好地找到我的函数......但事实并非如此。卫生署!
答案 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,抛出除了空规范之外的规范(声明该函数不允许抛出)对于任何类型的通用代码都是一个坏主意:你有没有的想法什么样的异常通用代码可能需要抛出。