在模板中使用静态const成员时出现链接器错误(例如std :: min)

时间:2017-09-18 19:16:49

标签: c++

今天我遇到了一些编译器行为,这对我来说似乎很奇怪。请考虑以下代码:

#include <iostream>
#include <algorithm>

struct test {
    static const int x = 1;
    static const int y = 2;
};

int main() {
    std::cout << std::min(test::x, test::y) << std::endl;

    return 0;
}

编译时(使用g ++ 5.4,6.3或clang ++ 4.0),链接器会抱怨它无法解析两个符号test :: x和test :: y。

$ clang++ test.cpp -o test  
/tmp/test-3cd074.o: In function `main':
test.cpp:(.text+0xa): undefined reference to `test::x'
test.cpp:(.text+0x14): undefined reference to `test::y'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但是,当显式(并且冗余地)将静态成员转换为其原始类型时,编译成功:

int main() {
    std::cout << std::min(static_cast<const int>(test::x), static_cast<const int>(test::y)) << std::endl;

    return 0;
}

这导致了预期的结果:

$ clang++ test.cpp  -o test && ./test  
1

只需通过std :: cout输出变量就可以在没有强制转换的情况下工作,因此使用值初始化另一个变量:

std::cout << test::x << std::endl; // Works!
int z = test::y; // Works as well!

现在我的问题是:当静态成员没有被转换时,为什么链接器不能解析符号?在模板外部访问成员时,为什么访问成员不是问题?

0 个答案:

没有答案