显式特化是使用部分特化语法

时间:2016-04-23 10:11:11

标签: c++ templates

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

只是错误的部分

public XmlDocument GetPunchListXml(string communityDesc)
{
    // 1. Use a new SqlConnection everywhere and do not register SqlConnection as a field on the class.
    // This is a Microsoft recommended best practice. Sql Server handles connection pooling so the call new SqlConnection is very cheap.
    // 2. a using block will close and dispose the connection for you
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        using (SqlCommand command = new SqlCommand("GetPunchList", connection))
        {
            command.CommandType = CommandType.StoredProcedure;

            SqlParameter parameter1 = new SqlParameter("@communityDesc", SqlDbType.VarChar);
            parameter1.Value = communityDesc;
            parameter1.Direction = ParameterDirection.Input;
            command.Parameters.Add(parameter1);

            // wrap your DataReader in a using block
            using (var reader = command.ExecuteXmlReader())
            {
                var doc = new XmlDocument();
                if (reader.Read())
                {
                   doc.Load(reader);
                }
                return doc;
            }
        }
    }
}

如果我通过更改为

来更正此错误
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;
    }
};

然后错误更改为“标识符'ta_a'未定义”

对解决方案的任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

这是错误的:

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说明符。您需要对其他专业化尝试进行类似的更改。

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