gpt4 book ai didi

模板、内部结构、本地类型和纯虚函数,天哪

转载 作者:行者123 更新时间:2023-12-02 03:42:56 28 4
gpt4 key购买 nike

考虑一个示例,其中方法是纯虚拟的,采用模板化类型的参数(从外部类型注入(inject)),并且该模板化类型是本地类型(在函数体中定义)。这种情况会导致 g++ 下的编译时错误。不可否认,这是一个极端案例,但它确实源自真实代码。这是一个可编译、可重现的示例:

#include <cstdio>

template<typename T>
struct Outer
{
struct InnerBase
{
virtual void foo(T const&) = 0;
virtual void bar(T const&) { };
};

struct InnerDerived : public InnerBase
{
void foo(T const&) override { std::printf("virtual call foo() worked\n"); }
void bar(T const&) override { std::printf("virtual call bar() worked\n"); }
};

InnerBase* inner;
Outer() : inner(new InnerDerived()) { }
};


struct NonLocalStruct { };

int main()
{
struct LocalStruct { };

Outer<NonLocalStruct> a;
Outer<LocalStruct> b;

a.inner->foo(NonLocalStruct()); // fine
a.inner->bar(NonLocalStruct()); // fine
b.inner->foo(LocalStruct()); // causes error
b.inner->bar(LocalStruct()); // fine

return 0;
}

有人可以解释为什么这会导致编译错误吗?为什么它适用于非本地类型而不适用于本地类型?为什么非纯虚方法有效而纯虚方法无效?

我正在使用带有 -std=c++11 的 g++ 4.8.1(我也在 VS2010 中尝试过这个例子,它编译和运行没有错误)。

g++ 的确切错误是:

test.cpp:8:16: error: 'void Outer::InnerBase::foo(const T&) [with T = main()::LocalStruct]', declared using local type 'const main()::LocalStruct', is used but never defined [-fpermissive]

最佳答案

我的猜测是这是一个 g++ 错误,它与旧的 C++98 限制使用本地类作为模板参数有某种关系

// C++98 Standard

14.3.1/2: A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as atemplate-argument for a template type-parameter.

在 C++11 中,这个限制已经取消。正如您所注意到的,Visual Studio 正确编译了它,Clang 也是如此。作为变通方法,添加抽象函数的定义适用于 g++

template<typename T>
void Outer<T>::InnerBase::foo(T const&) {};

Live Example .

我认为你应该提交一份 bug report到 g++。

关于模板、内部结构、本地类型和纯虚函数,天哪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18994041/

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