pol*_*ఠ_ఠ 4 c++ inheritance templates
有人可以告诉我为什么以下代码在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;
}
Run Code Online (Sandbox Code Playgroud)
在visual studio中,它会导致:
test succeeded
Run Code Online (Sandbox Code Playgroud)
但在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)) ===|
Run Code Online (Sandbox Code Playgroud)
问题出现在两阶段查找中,它在gcc/clang中实现,而不是在VS中实现.
你的代码应该使用typename,并this在需要的地方通过标准:
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");
}
};
Run Code Online (Sandbox Code Playgroud)
您可以阅读"模板"和"typename"关键字的位置和原因?和两相查找 - 需要解释