【问题标题】:How to organize classes containing mixture of templates and friends?如何组织包含模板和朋友混合的类?
【发布时间】:2018-05-16 05:33:20
【问题描述】:

我有两个 C++ 类:

  1. 第一个类包含一个指向第二个类的指针,并具有通过指针调用第二个类的公共方法的模板函数。由于是模板,该函数已在类声明中定义。
  2. 第二类允许第一类通过友谊机制访问其私有成员。

鉴于此,我的问题是:如何组织这种情况下的源/标头/前向声明? 无论我尝试了什么,它都无法编译为目标文件。

一个序列是这样的:

class Class2;

class Class1
{
        Class2 * c2;
public:
        template<typename T> T DoSomething(T& X)
        {
                c2->Func();
                return X;
        };

        void FuncFromClass1();

};

class Class2
{
        int data;
public:
        Class2() : data(0) {};
        void Func();
        friend void Class1::FuncFromClass1();
};

void Class2::Func()
{
        int i;
}

void Class1::FuncFromClass1()
{
        int j;
        c2 = new Class2;
        c2->data = 1;
}

吠叫invalid use of incomplete type ‘class Class2’,因为它无法识别c2-&gt;Func();。 另一个是:

class Class1;

class Class2
{
        int data;
public:
        Class2() : data(0) {};
        void Func();
        friend void Class1::FuncFromClass1();
};

class Class1
{
        Class2 * c2;
public:
        template<typename T> T DoSomething(T& X)
        {
                c2->Func();
                return X;
        };

        void FuncFromClass1();

}; 

void Class2::Func()
{
        int i;
}

void Class1::FuncFromClass1()
{
        int j;
        c2 = new Class2;
        c2->data = 1;
}

无法识别friend void Class1::FuncFromClass1();

编译尝试为g++ -c -std=c++11 -Wall test.cpp

请注意,如果可能的话,我宁愿不将 Class1 设为完整的朋友,而只想将其中一个方法作为 Class2 的朋友。

此外,我还没有在 Windows 的 Visual Studio 中尝试过完全相同的示例,但看到了完全同构的情况,就像所描述的那样(在一个更大的项目中),据我记得没有来自 VS 的投诉。是g++独有的吗?

【问题讨论】:

  • 由于c2-&gt;Func(); 不使用模板参数,您将其移至常规成员函数。
  • @RSahu 这只是一个非常简化的示例。我需要在我的实际大项目中保留它!

标签: c++ templates friend forward-declaration


【解决方案1】:

将成员函数模板的实现移动到Class2 的定义已知的位置。

class Class2;

class Class1
{
   private:
      Class2 * c2;
   public:

      // Delcare, don't define
      template<typename T> T DoSomething(T& X);

      void FuncFromClass1();

};

class Class2
{
   private:
      int data;
   public:
      Class2() : data(0) {};
      void Func();
      friend void Class1::FuncFromClass1();
};

// Define
template<typename T>
T Class1::DoSomething(T& X)
{
   c2->Func();
   return X;
};

请注意,如果两个类都定义在一个 .h 文件中,则建议的解决方案很简单。如果这些类是在单独的 .h 文件中定义的,事情会变得有点复杂。您必须确保在要使用 Class1::DoSomething() 的每个 .cpp 文件中定义 Class1::DoSomething() 的 .h 文件是 #included。

【讨论】:

  • 由于似乎没有更多的答案,我就接受你的:) 谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2011-05-16
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多