1

我正在尝试添加对添加 std::vector 的支持。这是我到目前为止的代码。不起作用的部分是我尝试打印结果的部分。我知道 valarray 但我无法让它以我想要的方式工作(大多数情况下我还没有找到将向量转换为 valarray 的简单方法)。

这是错误:

../src/VectorOperations.cpp:26:6: error: need 'typename' before 'std::vector<T>::iterator' because 'std::vector<T>' is a dependent scope

class VectorOperations
{
public:
    //Vector Operations
    std::vector<double> logv(std::vector<double> first);
    std::vector<double> raiseTo(std::vector<double> first, int power);
    std::vector<double> xthRoot(std::vector<double> first, int xth);
    double sumv(std::vector<int> first);

    std::vector<double> operator + ( const std::vector<double> & ) const;
    std::vector<double> operator - ( const std::vector<double> & ) const;
    std::vector<double> operator * ( const std::vector<double> & ) const;
    std::vector<double> operator / ( const std::vector<double> & ) const;

};


template <typename T>
std::vector<T> operator+(const std::vector<T>& a, const std::vector<T>& b)
{
    assert(a.size() == b.size());
    std::vector<T> result;
    result.reserve(a.size());
    std::transform(a.begin(), a.end(), b.begin(),
               std::back_inserter(result), std::plus<T>());

    std::cout<<"Results from addition follow: \n";
    //HERE'S THE PROBLEM: I WANT TO PRINT OUT BUT I GET ERRORS
        for(std::vector<T>::iterator it = a.begin(); it != a.end(); ++it) {
            /* std::cout << *it; ... */
        }
    return result;
}
4

3 回答 3

1

std::vector<T>::iterator取决于模板类型,尝试添加typename

for(typename std::vector<T>::iterator it = a.begin(); it != a.end(); ++it) {
    ^^^^^
于 2013-02-17T04:32:06.123 回答
1

编译器错误会告诉您确切的操作。for但是,我建议不要使用自己的循环,而是使用std::copy()

std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));

例如:

template <typename T>
std::ostream& operator <<(std::ostream& os, std::vector<T> const& v)
{
    os << "{";
    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));
    return os << "}";
}

[应用您自己的格式样式来品尝。]

然后你可以调用:

std::cout << "Results from addition follow: \n" << result << std::endl;

[最好从外部 operator +,因为这将是添加两个 s 的意外副作用vector。]

于 2013-02-17T05:41:20.157 回答
0

std::vector<T>::iterator it. 应该是typename std::vector<T>::iterator
您可以参考此 SO 链接以获取有关 typename 的详细信息我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

于 2013-02-17T04:33:07.710 回答