Linux编译错误 - GCC 4.3.4 - 模板参数列表太少

时间:2012-02-20 18:02:41

标签: c++ linux gcc

我有一个非常小的标题,其中包含以下代码。该代码现在在Windows 7中编译了6个月,但在linux中使用gcc 4.3.4失败了。我已经尝试了几种方法使其工作但不幸的是没有任何反应。你们中的任何人都知道可能出现的问题吗?

此致

#ifndef UTILS_H
#define UTILS_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <algorithm>

template <class T>
unsigned int findUpperElement(const std::vector<T>& aVec, const T& aTargetValue)
{
    typedef std::vector<T>::const_iterator itType;
    itType itMatch=upper_bound (aVec.begin(),aVec.end(), aTargetValue);
    return std::distance<itType>(aVec.begin(),itMatch);

}

template <class T>
unsigned int findLowerElement(const std::vector<T>& aVec, const T& aTargetValue)
{
    typedef std::vector<T>::const_iterator itType;
    itType itMatch=lower_bound (aVec.begin(),aVec.end(), aTargetValue);
    return std::distance< itType> (aVec.begin(),itMatch);

}

#endif

以下是我得到的错误:

./utilslib/Utils.h: In function ‘unsigned int findUpperElement(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
./utilslib/Utils.h:15: error: too few template-parameter-lists
./utilslib/Utils.h:16: error: ‘itType’ was not declared in this scope
./utilslib/Utils.h:16: error: expected `;' before ‘itMatch’
./utilslib/Utils.h:17: error: ‘itType’ cannot appear in a constant-expression
./utilslib/Utils.h:17: error: ‘itMatch’ was not declared in this scope
./utilslib/Utils.h: In function ‘unsigned int findLowerElement(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
./utilslib/Utils.h:24: error: too few template-parameter-lists
./utilslib/Utils.h:25: error: ‘itType’ was not declared in this scope
./utilslib/Utils.h:25: error: expected `;' before ‘itMatch’
./utilslib/Utils.h:26: error: ‘itType’ cannot appear in a constant-expression
./utilslib/Utils.h:26: error: ‘itMatch’ was not declared in this scope

2 个答案:

答案 0 :(得分:7)

typename 关键字添加到以下行:

typedef std::vector<T>::const_iterator itType;

更改为:

typedef typename std::vector<T>::const_iterator itType;

你的const_iterator是一个嵌套依赖类型 - 嵌套在你的模板参数类型中的类型,它取决于它。要理解你应该提供typename关键字的区别 - 告诉编译器这是基于模板类型T的类型名称。

编译器通常没有正确地实现这一点 - 有些让你比其他人更多地逃脱。

举一个例子说明这是必要的,请考虑一下:

T::X * var_name;

编译器可以将其解释为“我想要一个指向类型T :: X的指针,称为var_name”,或者它可以认为“我想将类T中的静态变量X乘以var_name中保存的值”。

像这样添加typename:

typename T::X * var_name;

会强制它更喜欢第一个,因为它现在知道T :: X在这个上下文中是一个类型。

答案 1 :(得分:0)

我在您的代码中看到的最大问题是您使用std::vector而不包含vector的头文件。

向其添加#include <vector>,看看是否有帮助。