gpt4 book ai didi

c++ - 专门化嵌套类的静态函数会导致编译器错误 C3855 (MSVC9)

转载 作者:行者123 更新时间:2023-11-30 01:29:28 32 4
gpt4 key购买 nike

这是 my previous question 的延续.

我正在尝试创建一个带有嵌套类模板的类模板,其中嵌套类模板有一个静态函数,我想为其提供专门化。

这里是我的测试代码,没有提供嵌套类的特化。请注意空类 NullType 的存在——这就是我想要专门针对嵌套类的内容。

#include <cstdlib>
#include <iostream>
using namespace std;

class NullType {};

template<class FooParam> struct Foo
{
template<class BarParam> struct Bar
{
static bool Magic();
};
};

template<class FooParam>
template<class BarParam>
bool Foo<FooParam>::Bar<BarParam>::Magic()
{
return true;
}

int main()
{
bool b = Foo<int>::Bar<int>::Magic();
cout << b << " ";
bool b2 = Foo<int>::Bar<NullType>::Magic();
cout << b2 << " ";

}

此代码按预期编译和运行。输出是:

1 1

现在我想在 NullType 上提供 Bar::Magic 的特化,并让该函数返回 false。期望的输出是:

1 0

所以我试着写这样的专业:

template<class FooParam>
template<>
bool Foo<FooParam>::Bar<NullType>::Magic()
{
return false;
} // COMPILER ERROR HERE C3855

此定义出现在 Foo::Bar::Magic() 的现有定义之前。

但是,此代码会导致编译器错误:

1>.\main.cpp(20) : error C3855: 'Foo<FooParam>::Bar<BarParam>': template parameter 'BarParam' is incompatible with the declaration

...在上面指出的右括号上。

我可以使用什么语法来提供这种特化?我愿意接受任何和所有技术来实现我的主要目标(为 NullType 返回 false ,为其他所有内容返回 true )只要:

  1. 没有使用外部库(没有提升)
  2. 它只使用符合标准的 C++
  3. Foo 是类模板,Bar 是嵌套类模板或函数模板。返回 falsetrue 的函数必须是可特化的或可重载的,以便调用 NullType 的代码返回 false 但其他一切都将返回 true

如果需要,我会澄清要求。

最佳答案

如@Ise Wisteria 的评论所述,C++03 和 C++11 都禁止在不对其封闭类进行专门化的情况下对嵌套类/方法进行专门化。

以下使用重载的解决方案是否适合您?

#include <cstdlib>
#include <iostream>
using namespace std;

class NullType {};

template<class FooParam> struct Foo
{
template<class BarParam> static bool Magic(BarParam);
static bool Magic(NullType);
};

template<class FooParam>
template<class BarParam>
bool Foo<FooParam>::Magic(BarParam)
{
return true;
}

template<class FooParam>
bool Foo<FooParam>::Magic(NullType)
{
return false;
}

int main()
{
bool b = Foo<int>::Magic(int());
cout << b << " ";
bool b2 = Foo<int>::Magic(NullType());
cout << b2 << " ";
}

关于c++ - 专门化嵌套类的静态函数会导致编译器错误 C3855 (MSVC9),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850640/

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