gpt4 book ai didi

c++ - 静态函数模板参数的外部链接

转载 作者:行者123 更新时间:2023-11-30 01:52:12 24 4
gpt4 key购买 nike

我无法找到以下非常小的程序无法编译的原因:

#include <stdint.h>

// Returns the alpha value of a texel at position (x, y) from src.
static inline uint8_t get_alpha(const uint8_t *src, int rowBytes, int x, int y) {
return *(src + y*rowBytes + x);
}

typedef uint8_t (*GetAlphaProc)(const uint8_t* src, int rowBytes, int x, int y);

template<GetAlphaProc getAlphaProc>
static void compress_block(uint8_t** dst, const uint8_t* src, int rowBytes) {
// Do some trivial stuff
uint64_t out = 0x0000000001FE000173ULL;
uint8_t a = getAlphaProc(src, rowBytes, 0, 0);
*(reinterpret_cast<uint64_t*>(*dst)) = (static_cast<uint64_t>(a) << 32) | out;
}

int main() {
// Initialization
uint8_t src[144]; for (int i = 0; i < 144; ++i) src[i] = i;
uint64_t out;
uint64_t* dst = &out;
uint8_t** dstPtr = reinterpret_cast<uint8_t**>(&dst);

compress_block<get_alpha>(dstPtr, src, 12);
}

正在产生的错误是:

[user ~/test]$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[user ~/test]$ g++ test-linkage.cpp -o testl
test-linkage.cpp: In function ‘int main()’:
test-linkage.cpp:25:46: error: ‘get_alpha’ is not a valid template argument for type ‘uint8_t (*)(const uint8_t*, int, int, int) {aka unsigned char (*)(const unsigned char*, int, int, int)}’ because function ‘uint8_t get_alpha(const uint8_t*, int, int, int)’ has not external linkage
test-linkage.cpp:25:46: error: no matching function for call to ‘compress_block(uint8_t**&, uint8_t [144], int)’
test-linkage.cpp:25:46: note: candidate is:
test-linkage.cpp:11:13: note: template<uint8_t (* getAlphaProc)(const uint8_t*, int, int, int)> void compress_block(uint8_t**, const uint8_t*, int)

问题是为什么错误 has not external linkage 对 g++ 很重要?这段代码中涉及的所有函数都有内部存储,而且从我能够谷歌搜索到的大部分文档来看,这对于静态函数是允许的。为什么在单个模块中编译时函数模板参数必须具有外部链接?

编辑

类似clang++下的构建问题:

[user ~/test]$ clang++ --version
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: x86_64-pc-linux-gnu
Thread model: posix

[user ~/test]$ clang++ -std=c++11 test-linkage.cpp -o testl
test-linkage.cpp:25:5: error: no matching function for call to 'compress_block'
compress_block<get_alpha>(dstPtr, src, 12);
^~~~~~~~~~~~~~~~~~~~~~~~~
test-linkage.cpp:11:13: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'getAlphaProc'
static void compress_block(uint8_t** dst, const uint8_t* src, int rowBytes) {
^
1 error generated.

最佳答案

过去只是一条硬性规定,没有异常(exception),模板参数不能有内部链接。这是一个硬性规定,因为还没有足够的实现经验来判断在什么地方可以使用这样的模板参数。

在 C++11 中,情况发生了变化,因为我们现在知道编译器可以毫无问题地处理它。模板参数现在可以有内部链接。要在 C++11 模式下编译,请将 -std=c++11 传递给命令行参数,或将 -std=gnu++11 传递给命令行参数已启用扩展程序。

请注意,millsj 的回答正确地指出了您代码中的另一个问题,修复您所询问的问题也会让 GCC 报告该问题。

关于c++ - 静态函数模板参数的外部链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25001470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com