繁体   English   中英

删除不必要的模板参数,但不再编译

[英]Removing unnecessary template argument, but doesn't compile anymore

对于使用auto和decltype的模板化函数,我有两种不同的方法,但是其中一种无法编译,会产生两个错误:

以下代码版本之间的主要区别在哪里:

这样编译

template<typename MemoryMapper, typename EngineParts>
class EngineBase {
    const MemoryMapper memoryMapper;
public:
    const EngineParts engineParts;
    EngineBase();
    virtual ~EngineBase();

    template<typename Mapper, typename MemoryAccessor>
    void getMemoryManager(void);

    template<MemoryMapper,typename MemoryAccessor>
    auto getMemoryManager(void)->decltype(memoryMapper.getMemoryManager<MemoryAccessor>())
    {
        return memoryMapper.getMemoryManager<MemoryAccessor>();
    }
};

虽然这不

template<typename MemoryMapper, typename EngineParts>
class EngineBase {
    const MemoryMapper memoryMapper;
public:
    const EngineParts engineParts;
    EngineBase();
    virtual ~EngineBase();
    template<typename MemoryAccessor>
    auto getMemoryManager(void)->decltype(memoryMapper.getMemoryManager<MemoryAccessor>())
    {
        return memoryMapper.getMemoryManager<MemoryAccessor>();
    }
};

错误输出如下:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -o EngineBase.o "..\\EngineBase.cpp" 
In file included from ..\EngineBase.cpp:7:0:
..\EngineBase.h:22:84: error: expected primary-expression before '>' token
  auto getMemoryManager(void)->decltype(memoryMapper.getMemoryManager<MemoryAccessor>())
                                                                                    ^
..\EngineBase.h:22:86: error: expected primary-expression before ')' token
  auto getMemoryManager(void)->decltype(memoryMapper.getMemoryManager<MemoryAccessor>())
                                                                                      ^

14:50:52 Build Finished (took 2s.587ms)

由于我不想在每次使用时都专门写第一个模板参数,并且会给人一种印象,即定义的函数比实际要多,因此如何在不引入另一个模板参数的情况下使第二个版本起作用? 函数参数可以,但是。

template<typename MemoryAccessor>
auto getMemoryManager(void)->decltype(memoryMapper.template getMemoryManager<MemoryAccessor>())
//                                                 ~~~~~~~^
{
    return memoryMapper.template getMemoryManager<MemoryAccessor>();
    //                  ~~~~~~~^
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM