簡體   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