gpt4 book ai didi

c++ - 模板继承类中函数定义错误

转载 作者:行者123 更新时间:2023-11-30 03:49:19 25 4
gpt4 key购买 nike

我有一个模板类和继承的问题,我无法弄清楚。这是使用的类。

带有 typedef 的接口(interface)模板类:

template < const unsigned long Number >
class IA
{
protected:
typedef TemplateVector<Item*, Number > List; //template array

public:
virtual List* getList() = 0;
};

具有相同 typedef (.hpp) 的真实类:

template < unsigned long Number >
class A : public IA< Number >
{
typedef typename IA< Number >::List List;

public:
virtual List* getList();

private:
List* m_list;

};
#include "A.cpp"

具有相同 typedef (.cpp) 的真实类:

template < unsigned long Number >
TemplateVector<Item*, Number >* A< Number >::getList()
{
return m_list;
}

问题出在 getList() 函数的 .cpp 定义上。编译时会导致错误,我不知道为什么。错误是

declaration is incompatible with "A<Number>::List *A<Number>::getList()

如果我改变:

typedef  typename IA< Number >::List List

typedef  TemplateVector<Item*, Number > List

它工作正常,但它是一个重新定义,我想避免这种警告。(请注意,我需要分成 .hpp 和 .cpp 文件,并且我使用了完整性编译器)

最佳答案

我想我明白发生这种情况的原因。考虑一个更简单的例子来演示同样的问题

template<class T>
struct base {
typedef int foo;
};

/*
struct other{};

template<>
struct base<float> {
typedef other foo;
};
*/

template<class T>
struct test {
static typename base<T>::foo bar();
};

template<class T>
int test<T>::bar() { // (1)
return 2;
}

这会在 gcc 中产生以下错误:

a.cpp:22:5: error: prototype for ‘int test<T>::bar()’ does not match any in class ‘test<T>’
int test<T>::bar() {
^
a.cpp:18:34: error: candidate is: static typename base<T>::foo test<T>::bar()
static typename base<T>::foo bar();
^

为什么会这样?考虑一下编译器在遇到第 (1) 行时会怎么想。即使没有模板实例化正在进行(因此编译器没有什么可以替代 T ),它可能会尝试将函数定义的 header 与其声明相匹配。它看到在定义中返回类型是 int , 而在声明中返回类型是 typename base<T>::foo .编译器如何知道它们对所有 都是同一类型T是吗?

显然编译器无法推断出这一点,因为它根本不是真的。事实上,如果你取消注释部分,你会发现对于 T=float base<T>::foo将是 other , 不是 int .

所以当编译器命中第 (1) 行时,它永远无法确定for each T base<T>::foo将是 int . (事实上​​ ,对于某些 T s,base<T> 可能根本没有 foo 成员。)因此,如果编译器试图在实际实例化之前检查返回类型,它没有其他方法但失败了。

我不太擅长这个标准,所以我不能用那里的引述来支持这个解释;也许我实际上错了,还有另一个基于标准的原因。

无论如何,正如我在评论中指出的那样,您不应该使用 StaticInternalVersatileVector<Item*, Number >*作为返回类型。最简单和最正确的方法是只使用 typename A<Number>::List* .

关于c++ - 模板继承类中函数定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32628143/

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