【问题标题】:Nested Template typedef - type definition嵌套模板 typedef - 类型定义
【发布时间】:2013-03-06 21:23:20
【问题描述】:

我正在尝试编译下面的代码。

文件 Class12.h

template <class T1>
class class1
{
public:
typedef T1 Type1;
void class1Method();
};

template <class T1>
void class1<T1>::class1Method()
{
}


template <class T1, class T2>
class class2
{
public:
typedef T2 Type2;
void class2Method();
};

template <class T1, class T2>
void class2<T1,T2>::class2Method()
{
  typedef typename::class2<typename class1<T1>::Type1, T2> Type3;
}

文件类.h

#include "class12.h"

template<>
class class2<int,double>
{
};

但是我收到以下错误:

g++ -g -c class.h -o class.o
In file included from class.h:1:
class12.h: In member function `void class2<T1, T2>::class2Method()':
class12.h:27: error: expected nested-name-specifier
class12.h:27: error: expected init-declarator before "Type3"
class12.h:27: error: expected `,' or `;' before "Type3"
make: *** [class.o] Error 1

有人可以帮帮我吗?

非常感谢您提前抽出宝贵时间。 谢谢。

【问题讨论】:

  • 啊,标签滥用...你能编辑你的帖子吗?
  • @Kerrek SB 你是什么意思?现在好吗? :)
  • 要格式化您的代码,您必须使用空格或制表符,但不能同时使用两者。如果你混合,缩进不会按照你想要的方式出现。还是坏了。

标签: c++ function templates nested typedef


【解决方案1】:

好吧,编译器非常明确:class1 是一个类模板,所以它需要模板参数。你这里没有:

typedef typename class2<typename class1::Type1> Type3;
          //                           ^ here!

你需要某种形式的东西

typedef class2<typename class1<T>::Type1> Type3;

T可能T2。注意不需要第一个typename

与您之前的问题一样,typedefs 应该是 public

【讨论】:

  • 根据您的建议和安迪的建议,我已经相应地更新了结尾。这确实有帮助,但是,现在我收到错误 g++ -g -c class12.h -o class12.o class12.h: In member function void class2&lt;T1, T2&gt;::class2Method()': class12.h:25: error: expected nested-name-specifier class12.h:25: error: expected init-declarator before "Type3" class12.h:25: error: expected ,' or `;'在“Type3”之前制作:*** [class12.o] 错误 1
  • @geraldCelente 你有没有像我建议的那样制作public 的typedef?此外,您似乎正在尝试将模板代码编译到目标文件中。你不能那样做。您需要将它包含在使用特定类型实例化它的代码中,然后编译 那个 代码。
  • 您好。非常感谢您的时间和耐心:)。我已经根据您的建议和安迪的建议更新了代码。但是我不断收到同样的错误。老实说,我认为问题与我的代码中的访问级别无关,示例所基于的类型都是公共的。
  • 我也不认为这与我将其编译成目标文件有关。我知道我可以编译一个模板类并将其用作库;但是,模板类确实会编译为对象类。我总是这样做以确保我的代码在将模板类设置为其他类并使它们成为我项目的一部分之前在语法上是正确的。
  • @Bo Persson 谢谢!这就是解决办法。谢谢。我不得不替换 typedef typename::class2::Type1, T2> Type3; with typedef class2::Type1, T2> Type3;
【解决方案2】:

在这一行:

typedef typename class2<typename class1::Type1> Type3;

您没有为class1&lt;&gt; 类模板提供任何模板参数。此外,您不需要typename 关键字,除非您有一个合格的从属名称。您是否拥有一个取决于您要如何实例化class1&lt;&gt;

此外,如果您想将class1Method()class2Method() 分别作为class1class2 的成员函数,则应使用以下语法:

template <class T1>
class class1
{
    typedef T1 Type1;
    void class1Method();
};

template <class T2>
void class1<T2>::class1Method()
//   ^^^^^^^^^^^^
{
}

更新:

编辑后,您问题中的代码还有一个问题:class2Method() 成员函数内的名称class2 指的是函数所属的类,它是一个实例化class2。要引用class2模板,您可以使用它所属的命名空间(在本例中为全局命名空间)来限定名称:

typedef typename ::class2<typename class1<T1>::Type1, T2> Type3;
//               ^^

另外,不要忘记为类成员提供正确的访问级别,否则您将无法从其成员函数之外访问它们:对于classes,默认值为private。我认为在这种情况下你应该使用public。例如:

template <class T1>
class class1
{
public: // <== MAKE THE MEMBERS AND TYPE DEFINITIONS ACCESSIBLE TO 
        //     FUNCTIONS WHICH ARE NOT MEMBER FUNCTIONS OF THIS CLASS
    typedef T1 Type1;
    void class1Method();
};

【讨论】:

  • 根据您的建议和 juanchopanza 的建议,我已相应地更新了结尾。这确实有帮助,但是,现在我收到错误 g++ -g -c class12.h -o class12.o class12.h: In member function void class2&lt;T1, T2&gt;::class2Method()': class12.h:25: error: expected nested-name-specifier class12.h:25: error: expected init-declarator before "Type3" class12.h:25: error: expected ,' or `;'在“Type3”之前制作:*** [class12.o] 错误 1
  • 您好。非常感谢您的时间和耐心:)。我已经根据您的建议和 juanchopanza 更新了代码。但是我不断收到同样的错误。老实说,我认为问题与我的代码中的访问级别无关,示例所基于的类型都是公共的。
  • @geraldCelente:那么您是否也使用了::class2 而不是class2?也许你应该发布你的真实代码,否则我们将解决你没有的问题而不是解决你有的问题
  • 它不起作用,因为我有 typedef typename::class2::Type1, T2> Type3;而我需要 typedef class2::Type1, T2> Type3;谢谢你们的支持。没有你的帮助,我不会修好它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多