【发布时间】:2014-12-30 11:38:37
【问题描述】:
我发布了完整的源代码,很抱歉之前没有这样做。
myclass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
#include <cstring>
#include <iostream>
#include <fstream>
class MyClass
{
public:
/*
* @Brief Constructor
*/
MyClass();
/*
* @Brief Constructor
* @param orig
*/
MyClass(const MyClass & orig);
/*
* @Brief Destructor
*/
virtual ~MyClass();
template<typename T> bool openFile(T &file);
private:
};
template <typename T>
class streamType
{
public:
static bool isInStream() { return false; }
};
//
// Specialized for the ifstream
//
template<>
class streamType<std::ifstream>
{
public:
static bool isInStream() { return true; }
};
#endif
myclass.cpp:
#include "myclass.h"
MyClass::MyClass()
{
}
MyClass::MyClass(const MyClass & orig)
{
}
MyClass::~MyClass()
{
}
template<typename T> bool MyClass::openFile(T &file)
{
std::string path, filename;
if(streamType<T>::isInStream())
{
file.open(path + filename, std::ios::in | std::ios::binary | std::ios::ate);
}
else
{
file.open(path + filename, std::ios::out | std::ios::binary | std::ios::ate);
}
}
主要:
#include <cstdlib>
#include "myclass.h"
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
std::ifstream in;
std::ofstream out;
MyClass foo;
if(foo.openFile(in)) //reading
{
// do something
in.close();
}
if(foo.openFile(out)) // writing
{
// do something
out.close();
}
return 0;
}
目前我有两个错误,但之前只有一个 ....???迷茫
编译器错误: 未定义对“bool MyClass::openFile > >(std::basic_ifstream >&)”的引用 未定义对“bool myfile::openFile > >(std::basic_ofstream >&)”的引用 make[2]: *** [dist/Debug/Intel-Linux-x86/test] 错误 1
Gg
【问题讨论】:
-
错误应该被阅读
-
您是否记得只将模板放在头文件中?
-
所以这是一个链接器错误。我怀疑你在 cpp 中定义了模板函数。
-
是的,在同一个.h头文件中定义:“openFile(T &file)”,模板
class streamType”和“template class streamType<:ifstream>” -
声明和定义需要在header文件中。您不应该为
MyClass使用 .cpp 文件。
标签: c++ templates compiler-errors fstream