如何从模板获取const向量元素的引用

时间:2018-06-21 22:49:31

标签: c++ templates const

我有这个main.cpp

std::string hw[] = { "Hello", "World" };
const array_appender<std::string> ha( hw, sizeof( hw ) / sizeof( hw[ 0 ] ) );

if ( /*with some other conditions*/ &( ha.at( 0 ) ) == hw )
{
  //some other stuff
}

我有这个模板:

template<typename T>
class array_appender {
public:
    array_appender(T* array, size_t size) {
        append(array, size);
    }

    void append(T* array, size_t size) {
        for( int idx = 0; idx < size; ++idx)
        {
            std::cout << "value of array: " << array[idx] << std::endl;
            data.add(array[idx]);
        }
    }

    T at(size_t index) const {
        return data[index];
    }

    size_t size() {
        return data.size();
    }

    const size_t size() const {
        return data.size();
    }

private:
    std::vector<T> data;
};

但是由于上述情况,我得到了这个错误:

error: taking address of temporary [-fpermissive]

我进行了搜索,但是在这种情况下,我发现的解决方案对我不起作用。感谢您的任何想法!

2 个答案:

答案 0 :(得分:3)

调用&( ha.at( 0 )时,您正在使用临时变量(h.at(0))的地址(&)。

您可以尝试std::string tmp = ha.at( 0 ),并获取tmp的地址,但是...字符串的地址绝对不可能等于字符串的数组!您正在将临时变量的地址与对象中成员的地址进行比较。您是要比较字符串吗?

答案 1 :(得分:2)

array_appender<T>::at返回T,它将是调用站点ha.at(0)上的一个临时对象(右值)。然后,您将其地址设为&ha.at(0),这是被禁止的,因此出现错误“获取临时地址”。

通常,诸如at之类的方法返回对该对象的引用,以便可以对其进行修改(当然,如果需要的话):

T & at(size_t index) const {
    return data[index];
}

然后,使用此左值的地址是有效操作。

看看std::array::atstd::vector::atstd::map::at