gpt4 book ai didi

c++ - 类模板继承在 GCC 中编译失败,但在 Visual Studio 中有效

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:13 36 4
gpt4 key购买 nike

有人能告诉我为什么以下代码在 Visual Studio 2010 中完美运行,但在 gcc 5.3 中无法编译,尽管它看起来没有任何问题?我已经进行了一些谷歌搜索,但没有找到描述模板类继承的清晰标准方法。

#include <iostream>
#include <string>

namespace foobar
{
template <typename Char_Type = char>
class basic_foo
{
public:
inline basic_foo(){}
virtual ~basic_foo(){}

typedef std::basic_string< Char_Type > str_foo;
enum { fooEnum = 100 };
};

template <typename Char_Type = char>
class basic_bar :private basic_foo <Char_Type>
{
public:
basic_bar(){}
~basic_bar(){}

str_foo bar1()
{
int i = fooEnum;
return str_foo("test succeeded\n");
}
};
}

typedef foobar::basic_bar<> bar2;

int main()
{
bar2 bar;
std::cout << bar.bar1();
return 0;
}

在 visual studio 中,它导致:

test succeeded

但是在 gcc 中,它说:

main.cpp|24|error: unknown type name 'str_foo'
main.cpp|26|error: use of undeclared identifier 'fooEnum'
main.cpp|27|error: use of undeclared identifier 'str_foo'
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

最佳答案

问题出在两阶段查找,这是在gcc/clang中实现的,在VS中没有实现。

您的代码应在标准需要的地方使用 typenamethis:

template <typename Char_Type = char>
class basic_bar :private basic_foo <Char_Type>
{
public:
basic_bar(){}
~basic_bar(){}

typename basic_foo<Char_Type>::str_foo bar1()
{
int i = this->fooEnum;
return typename basic_foo<Char_Type>::str_foo("test succeeded\n");
}
};

live example

您可以阅读 Where and why do I have to put the "template" and "typename" keywords?Two phase lookup - explanation needed

关于c++ - 类模板继承在 GCC 中编译失败,但在 Visual Studio 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007953/

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