英特尔编译器不喜欢auto end()const - > decltype(map.cend())

时间:2014-04-19 19:27:33

标签: c++ c++11 intel

我已经在std::unordered_map周围写了一些包装代码,所以我可以暂时使用它进行多线程访问(我知道有更好的方法可以做到这一点)。

作为课程的一部分,我有以下代码允许每次迭代std::unordered_map

auto begin() const ->decltype(map.cbegin()) { 
    return map.begin(); 
}

auto end()   const ->decltype(map.cend())   {
    return map.end(); 
}

但英特尔编译器( v14 )并不喜欢这样:

error #288: a nonstatic member reference must be relative to a specific object
1>      auto begin() const ->decltype(map.cbegin()) { 

error #288: a nonstatic member reference must be relative to a specific object
1>      auto end()   const ->decltype(map.cend())   {

我有什么建议可以解决这个问题吗?以上是在MSVC 12上工作的。我更喜欢适用于大多数编译器的解决方案吗?

#include <string>
#include <thread>
#include <unordered_map>
#include <memory>
#include <boost\shared_ptr>

class my_map {
private:
    std::unordered_map<std::string, boost::shared_ptr<int> > map;
    std::mutex mtx;

public:

    boost::shared_ptr<int>& operator[](std::string key)
    {
        return map[key];
    }

    auto begin() const ->decltype(map.cbegin()) { 
        return map.begin(); 
    }

    auto end()   const ->decltype(map.cend())   {
        return map.end(); 
    }
};

我省略了构造函数和insert()

更新:找到问题,当我将std::unordered_map商店的类型从int更改为MyClass时,就会发现问题。

MyClass是否需要在其中明确声明的内容才能使上述内容正常工作?

0 个答案:

没有答案