c++ - 显式特化是使用部分特化语法

标签 c++ templates

我正在尝试使用我通过显示代码正常运行的教程找到的这个 vector 。但是,当我尝试在我的项目中使用它时,它返回错误“错误 C3211:‘vector::vecarg’:显式特化正在使用部分特化语法,请改用模板 <>”

只是有错误的部分

template< class ta_a >
class vecarg
{
    const ta_a& Argv;
public:
    inline vecarg(const ta_a& A) : Argv(A) {}
    inline const float Evaluate(const int i) const
    {
        return Argv.Evaluate(i);
    }
};

template< class ta_a>
class vecarg< const float >
{
    const ta_a& Argv;
public:
    inline vecarg(const ta_a& A) : Argv(A) {}
    inline const float Evaluate(const int i) const
    {
        return Argv;
    }
};

template< class ta_a >
class vecarg< const int >
{
    const ta_a& Argv;
public:
    inline vecarg(const ta_a& A) : Argv(A) {}
    inline const float Evaluate(const int i) const
    {
        return (float)Argv;
    }
};

如果我通过更改为

来更正此错误
template< >
class vecarg< const float >
{
    const ta_a& Argv;

然后错误变为“标识符‘ta_a’未定义”

非常感谢任何关于解决方案的建议。

最佳答案

这是错误的:

template< class ta_a>
class vecarg< const float >

这是一个错误,因为 vecarg只有一个模板参数:它可以专用于该参数,但没有更多的模板参数。但是这段代码试图写两个参数,ta_afloat .

错误消息谈论“部分特化”,因为 template<class T> 引入了特化必须是部分的(它不是完整的,因为它仍然有参数 T )。

完整特化的代码是:

template<>   // zero parameters which have not been specialized
class vecarg< const float >
{
    const float& Argv;
public:
    vecarg(const float& A) : Argv(A) {}
    const float Evaluate(const int i) const
    {
        return Argv;
    }
};

我删除了多余的 inline说明符。您需要对其他特化尝试进行类似的更改。

如果此代码的作者声称它已编译,他/她一定有一些非常古怪的编译器。

关于c++ - 显式特化是使用部分特化语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809411/

相关文章:

java - 是否可以使用复杂的 XML 模板文件动态生成 Android UI?

templates - 有哪些好的开源项目登陆页面?

c++ - 为泛型类型重载函数与为给定类型及其子类型重载函数

php - Laravel 5.2 在 Blade 中使用变量的正确方法

c++ - 重载运算符以将我自己的类作为标准类处理是一种好习惯吗?

c++ - 为什么这会给出大小为 8 的未初始化值的使用

c++ - 将具有多个空终止字符的字符数组解析为不同的字符串 - C++

c++ - 在 C++ 中创建双向链表

c++ - 与不同架构上的数据对齐相关的问题是什么?

c++ - 如何获得一个 friend 类的模板函数而不会出现错误