【问题标题】:Templated friend class in nontemplate class, where friend also uses the class非模板类中的模板化朋友类,朋友也使用该类
【发布时间】:2016-10-29 07:13:06
【问题描述】:

背景

我有一个非模板类,称为library 和一个模板类library_file,旨在为不同的文件类型(如std::fstreamQFile 等)提供一个模板参数F保存/加载library

假设

所以我在library 的定义之前提出了library_file 的前向声明,并在最后一个中提出了朋友声明。因为,由于library_file 包含library,否则我将进入依赖圈。

问题

朋友声明失败

在 /Users/markus/Entwicklung/cmake_Spielwiese/library.cpp:4 包含的文件中: /Users/markus/Entwicklung/cmake_Spielwiese/library.h:12:12:错误:C++ 需要所有声明的类型说明符 朋友库文件; ~~~~~~ ^ /Users/markus/Entwicklung/cmake_Spielwiese/library.h:12:12: 错误:好友只能是类或函数 产生 2 个错误。

代码

/*! @file library.h
 * */

#ifndef CMAKE_CPP_SPIELWIESE_LIBRARY_H
#define CMAKE_CPP_SPIELWIESE_LIBRARY_H

template <typename F>
class library_file;

class library {
    template <typename F>
    friend library_file;

};


#endif //CMAKE_CPP_SPIELWIESE_LIBRARY_H

/*! @file library_file.h
 * */

#ifndef CMAKE_CPP_SPIELWIESE_LIBRARY_FILE_H
#define CMAKE_CPP_SPIELWIESE_LIBRARY_FILE_H

#include "library.h"

template <typename F>
class library_file {
    F file;
    library l;
};


#endif //CMAKE_CPP_SPIELWIESE_LIBRARY_FILE_H

/*! @file main.cpp
 * */
#include <fstream>
#include "library.h"
#include "library_file.h"

int main() {
    library_file<std::fstream> f;
    return 0;
}
/*! @file library.cpp
 * */

#include "library.h"

【问题讨论】:

    标签: c++ oop templates c++11 c++14


    【解决方案1】:

    模板友元类的正确声明是:

    template<class F> friend class library_file;
    

    Class template with template class friend, what's really going on here?

    【讨论】:

    • 这很尴尬,我只是忘记了 class 关键字。谢谢:-)
    • 有时我们只需要有人重新审视我们的代码!
    【解决方案2】:

    您忘记了library_file.h 中的class 关键字,之后它就可以正常编译了

    #ifndef CMAKE_CPP_SPIELWIESE_LIBRARY_H
    #define CMAKE_CPP_SPIELWIESE_LIBRARY_H
    
    template <typename F>
    class library_file;
    
    class library {
        template <typename F>
        friend class library_file;
    
    };
    
    
    #endif //CMAKE_CPP_SPIELWIESE_LIBRARY_H
    

    【讨论】:

    • 也谢谢,但丹尼尔更快 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2011-10-14
    • 1970-01-01
    • 2011-03-18
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多