gpt4 book ai didi

C++:调试 C++ 模板链接器错误

转载 作者:行者123 更新时间:2023-11-28 03:32:12 25 4
gpt4 key购买 nike

我在以下代码中遇到了一个奇怪的链接器错误:

代码使用类型特征为所有类型提供部分模板特化 A<T>其中 T不是 X 的子类型.

class X{};

#include <type_traits>

//Enabler for all types that are not a subtype of X
#define enabler(T) typename std::enable_if<!std::is_base_of<X, T>::value>::type


//A template (second param is only for enabling partial specializations)
template <typename T, typename = void>
struct A{};

//Partial template specialization for instances
//that do not use a T which is a subclass of X
template <typename T>
struct A<T, enabler(T)>{
static int foo(); //Declaration only!
};

//Definition of foo() for the partial specialization
template <typename T,enabler(T)>
static int foo(){
return 4;
}

int bar = A<int>::foo();

int main(){}

即使这只是一个文件,链接也会失败。问题似乎是 foo() 的非内联定义。一旦我内联它,一切正常。在实际代码中,由于循环依赖,我无法将其内联。

错误如下:

/tmp/ccS7UIez.o: In function `__static_initialization_and_destruction_0(int, int)':
X.cpp:(.text+0x29): undefined reference to `A<int, void>::foo()'
collect2: ld returned 1 exit status

那么问题出在哪里呢?

最佳答案

静态成员函数的定义A<T, enabler(T)>::foo有语法错误,应该是:

template <typename T>
int A<T, enabler(T)>::foo(){
return 4;
}

关于C++:调试 C++ 模板链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215732/

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