模板预编译 - C++模板按unsigned值编译
天蓬老师
天蓬老师 2017-04-17 13:44:48
0
1
615
#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;
}

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(1)
左手右手慢动作

这种情况下不是用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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!