【问题标题】:Template argument string vs. int [duplicate]模板参数字符串与 int [重复]
【发布时间】:2012-11-24 17:03:42
【问题描述】:

可能重复:
Strings as template arguments?

为什么第一个声明可以,第二个不行?为什么std::string不适合?

template <typename T, T x> struct foo { };

using namespace std;

int main()
{
    foo<int, 0> f_int;              // ok
    foo<string, ""> f_string;      // not ok
}

我明白了:

error: a non-type template parameter cannot have type 'std::basic_string<char>'

使用 clang++。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您根本不能拥有std::string 类型的模板参数。非类型模板参数的规则由标准定义如下(§14.1/4):

    非类型模板参数应具有以下类型之一(可选cv-qualified):

    • 整数或枚举类型,
    • 指向对象的指针或指向函数的指针,
    • 对对象的左值引用或对函数的左值引用,
    • 指向成员的指针,
    • std::nullptr_t

    此外(§14.1/7):

    不应将非类型模板参数声明为具有浮点、类或void类型。

    由于std::string 是一个类类型,您的foo 的实例化是不允许的。

    【讨论】:

      【解决方案2】:

      因为非类型模板参数(“值”的丑陋名称)在编译时应该是可计算的,而 std::string 不是(它可能需要动态内存分配,因此它的构造函数不是 constexpr)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 2013-04-17
        相关资源
        最近更新 更多