我有这个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]
我进行了搜索,但是在这种情况下,我发现的解决方案对我不起作用。感谢您的任何想法!
答案 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];
}
然后,使用此左值的地址是有效操作。