我发布了完整的源代码,我很抱歉以前没有这么做过。
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;
}
目前我有两个错误,但之前只有一个.... ???困惑
编译错误: 未定义引用&#34; bool MyClass :: openFile&gt; &gt;(std :: basic_ifstream&gt;&amp;)&#34; 未定义引用&#34; bool myfile :: openFile&gt; &gt;(std :: basic_ofstream&gt;&amp;)&#34; make [2]:*** [dist / Debug / Intel-Linux-x86 / test]错误1
千兆克
答案 0 :(得分:0)
从openFile()
删除myclass.h
的定义。然后在myclass.cpp
中,将函数的声明替换为其定义,如下所示:
template<typename T>
bool 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);
}
// you should return something in a fuunction returning a bool
}
正如0x499602D2所说,声明和定义需要在头文件中。
然而,现在这一行
if(streamType<T>::isInStream())
会导致如下错误:
error: ‘streamType’ was not declared in this scope
error: expected primary-expression before ‘>’ token
error: ‘::isInStream’ has not been declared
我不确定streamType
是否是C ++,它看起来像是一个C#功能,但这是一个不同的问题。
答案 1 :(得分:0)
声明和定义必须位于头文件中。您 不应该为MyClass使用.cpp文件。 - 0x499602D2 2小时 前强>
答案是否正确!!
or
在头文件中放入模板函数的声明和定义,留在.cpp其他类函数中,因为如上所述
Piotr S.“模板功能仅在头文件中”。
这也是正确的!! 谢谢大家
我知道有一个技巧可以将模板放在.cpp文件中,但从我的观点来看,它不再是模板。
技巧:在.cpp文件中使用#define currentType T.