【问题标题】:Why this code does not compile using MS compiler?为什么这段代码不能使用 MS 编译器编译?
【发布时间】:2011-11-27 08:14:15
【问题描述】:

此代码使用 GNU gcc 编译器编译,而如果使用 Visual Studio 2008 编译器则不编译。

错误sas:“错误C2143:语法错误:缺少';'在'*'之前

Arbol::Nodo* 是指向 Arbol 内部类的指针,如果使用代码块 + gnu gcc 编译器进行编译,则可以正常工作。

template <class T>
Arbol<T>::Nodo<T>* Arbol<T>::Alta(Nodo<T>* &nodo,const T d) /////this line is highlited
{
     return nodo;
}

很奇怪,如果我把那个代码拿出来重新编译,它会在它下面跳转三个函数,然后 使用此函数会引发相同的错误

 template<class T>
 Arbol<T>::Nodo<T>* Arbol<T>::BuscarDevolver(const T t)
 {
     Nodo<T>* nodo = new Nodo<T>;
     return nodo;
 }

【问题讨论】:

  • 第二个例子中的错字?节点?

标签: c++ visual-studio-2008 compiler-errors


【解决方案1】:

添加typename:

template <class T>
typename Arbol<T>::Nodo<T>* Arbol<T>::Alta(Nodo<T>* &nodo,const T d) /////this line is highlited
{
     return nodo;
}

您需要在模板中显式标记作为类型的限定名称。

【讨论】:

  • 这是视觉工作室的东西吗?
  • @HoNgOuRu,这是一个 C++ 的东西。
  • 应该是typename Arbol&lt;T&gt;::template Nodo&lt;T&gt;*(我想)
  • @ildjarn,如果 Nodo 是一个模板函数,您将需要额外的模板关键字来显式实例化,例如nodo.template get_foo&lt;int&gt;()。我认为声明类型时不适用。
猜你喜欢
  • 2012-07-06
  • 2010-10-24
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多