簡體   English   中英

C++ 中模板化 class 的模板化友元的顯式模板實例化

[英]Explicit template instantiation of templated friend of templated class in C++

我有一個主要的 class MainClass ,其私有成員變量應該對朋友 class FriendClass 兩者都由一個名為dimint模板化,並且它們都有各自的 header 和源文件(因此位於不同的翻譯單元中)。 由於MainClass並不真正依賴於FriendClass (並避免循環依賴),我在 MainClass 中進行朋友聲明時將FriendClass聲明為模板MainClass 此外,在源文件的末尾,我明確地實例化了兩個類dim = 2dim = 3 但是,當我編譯時,當我嘗試在FriendClass的方法中使用MainClass的私有成員變量在此上下文中是私有的時,我得到一個錯誤。 我懷疑這與 FriendClass 的特定實例化無法識別FriendClass的相應實例化MainClass其聲明為朋友這一事實有關,但我不確定如何解決該問題。 代碼:

// MainClass.hpp
#ifndef MAIN_CLASS_HPP
#define MAIN_CLASS_HPP

template <int dim>
class MainClass
{
public:
    MainClass(){};
private:
    
    template <int friend_dim>
    class FriendClass;
    
    friend class FriendClass<dim>;
    
    double private_member = 3.0;
};

#endif
// MainClass.cpp
#include "MainClass.hpp"

template class MainClass<2>;
template class MainClass<3>;
// FriendClass.hpp
#ifndef FRIEND_CLASS_CPP
#define FRIEND_CLASS_CPP

#include "MainClass.hpp"

template <int dim>
class FriendClass
{
public:
    FriendClass(){};
    
    void print_main_class(MainClass<dim> &main_class);
};

#endif
// FriendClass.cpp
#include "FriendClass.hpp"

#include <iostream>

template <int dim>
void FriendClass<dim>::print_main_class(MainClass<dim> &main_class)
{
    std::cout << main_class.private_member << std::endl;
}

template class FriendClass<2>;
template class FriendClass<3>;
// main.cpp
#include "MainClass.hpp"
#include "FriendClass.hpp"

int main()
{
    const int dim = 2;
    MainClass<dim> main_class;
    FriendClass<dim> friend_class;
    
    friend_class.print_main_class(main_class);

    return 0;
}

可在線編譯的代碼gdb.com

您已經聲明了兩個不同的 class 模板,均名為FriendClass 大概是無意的。

一個是全局FriendClass ,另一個是MainClass::FriendClass

您可以通過在其存在的命名空間中前向聲明您的 class 模板來解決此問題。

// MainClass.hpp
#ifndef MAIN_CLASS_HPP
#define MAIN_CLASS_HPP

template <int>
class FriendClass;

template <int dim>
class MainClass
{
public:
    MainClass(){};
private:
    
    friend FriendClass<dim>;
//  Now the global FriendClass is a friend.
    
    double private_member = 3.0;
};

#endif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM