![](/img/trans.png)
[英]C++ Explicit templated function instantiation for templated class of different type
[英]Explicit template instantiation of templated friend of templated class in C++
我有一個主要的 class MainClass
,其私有成員變量應該對朋友 class FriendClass
。 兩者都由一個名為dim
的int
模板化,並且它們都有各自的 header 和源文件(因此位於不同的翻譯單元中)。 由於MainClass
並不真正依賴於FriendClass
(並避免循環依賴),我在 MainClass 中進行朋友聲明時將FriendClass
聲明為模板MainClass
。 此外,在源文件的末尾,我明確地實例化了兩個類dim = 2
和dim = 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.