尝试理解another question,我已经简化了获取以下代码的示例。
template <bool>
struct foo
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
template <typename T>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
g ++ 4.9.2编译没有问题; clang ++ 3.5给出以下错误
tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not
match any declaration in 'foo<true>'
auto foo<true>::bar (int i)
^~~
用auto
替换两个int
返回值中的一个,没有变化:g ++ compile和clang ++给出了错误。将auto
替换为int
,错误消失。
template <typename T>
部分非常重要,因为以下代码编译时两个编译器都没有问题
template <bool>
struct foo
{
auto bar (int i)
{ return i; }
};
template <>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
我的问题很明显:谁对吗?
g ++或clang ++?
我认为g ++是正确的,这是来自clang ++的错误,但我要求确认。
p.s:抱歉我的英语不好。
答案 0 :(得分:0)
我有同样的问题,这是solution。
除了你还应该考虑到自C ++ 14以来只允许隐式自动返回类型,所以你应该使用-std=c++14
编译标志,或者显式设置返回类型(对于C ++ 11)。
问题是CLang与模板类的模板函数的特殊性不匹配。要解决这个问题,你应该有一个模板类的空声明和单独的特化:
template <bool>
struct foo;
template <>
struct foo <false>
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
struct foo <true>
{
template <typename T>
auto bar (int i)
{ return i; }
};
int main()
{
return 0;
}