在类定义下方的函数定义中,根据 GCC 和 Clang,后两个“typename”不应该存在,但它可以在 Visual Studio 上编译。有人知道为什么吗?当 Visual Studio 在很多方面似乎不符合规范时,在不同的编译器上编译我的代码非常困难。
#include <iostream>
class BaseClass { };
/* CLASS DEFINITION */
template <typename getter_t, typename setter_t>
class MyClass : public BaseClass
{
public:
using getter_return_t = int;
void reset_value_to(const getter_return_t&, const char* to_append);
};
/* FUNCTION DEFINITION */
template <typename getter_t, typename setter_t>
void MyClass<typename getter_t, typename setter_t>::reset_value_to(const getter_return_t& value, const char* to_append)
{
std::cout << "Yo";
}
int main()
{
MyClass<int, int> c;
c.reset_value_to(5, nullptr);
}
显然这是错误的,但它在 C++20 上的 Visual Studio 上编译,并且我已禁用语言扩展。我可以设置其他选项来使 Visual Studio 编译器更加一致吗?
根据编译器资源管理器的输出,问题似乎出在这里:
MSVC 接受这一点,但 Clang 不接受。
它可能应该是这样的,没有额外的
typename
关键字:MSVC、GCC 和 Clang 都接受这一点。