ifstream或ofstream类型由模板函数调用

时间:2014-12-30 11:38:37

标签: c++ templates compiler-errors fstream

我发布了完整的源代码,我很抱歉以前没有这么做过。

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

千兆克

2 个答案:

答案 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.