首頁  >  問答  >  主體

模板预编译 - C++模板按unsigned值编译

#include <cstdio>

template<unsigned N>
int func() {
    if(N>100) {
        return 1;
    } else {
        static const char c = N; // g++: error, clang++: pass
        static const char s[1] = {N}; // both error
        printf("%c\n",c);
        return 0;
    }
}

int main() {
    func<1000>();
    return 0;
}

如图程序,为什么会有编译时错误呢?明明走了另一个分支啊!

天蓬老师天蓬老师2762 天前652

全部回覆(1)我來回復

  • ringa_lee

    ringa_lee2017-04-17 13:46:48

    這種情況下不是用if的,要用specialization。與你的程式碼的邏輯等價的語法是:

    template<unsigned N>
    std::enable_if<(N <= 100), int>::type
    func() {
        static const char c = N; // g++: error, clang++: pass
        static const char s[1] = {N}; // both error
        printf("%c\n",c);
        return 0;
    }
    
    template<unsigned N>
    std::enable_if<(N > 100), int>::type
    func() {
        return 1;
    }

    這樣才會避免編譯器在重載決議的時候把含有語法錯誤的程式碼加入編譯。

    回覆
    0
  • 取消回覆