使用bool非类型参数实例化类模板时出错

时间:2012-07-09 14:24:14

标签: c++ templates

我很难弄清楚为什么下面显示的依赖项代码不能编译,并希望有助于帮助修复它。

的main.cpp

#include <cstdlib>
#include <iostream>

#include "Foo.h"
#include "Bar.h"

int main()
{
    Foo<Bar> f1;        // ERROR
    Foo<Bar,true> f2;   // works
    return EXIT_SUCCESS;
}

foo.h中

template<typename T, bool S = T::HAS_NATIVE_SUPPORT>
struct Foo
{
};

Bar.h

struct Bar
{
    static const bool HAS_NATIVE_SUPPORT;
};

Bar.cpp

#include "Bar.h"
const bool Bar::HAS_NATIVE_SUPPORT = true;

我在Visual Studio 2008命令提示符中出现以下错误

cl main.cpp Bar.cpp
main.cpp(12) : error C2975: 'S' : invalid template argument for 'Foo', expected compile-time constant expression
        c:\tmp\c++tests\so\Foo.h(1) : see declaration of 'S'

在g ++(GCC)4.5.3中,我收到以下错误消息:

$ g++ main.cpp Bar.cpp
main.cpp: In function ‘int main()’:
main.cpp:12:9: error: ‘Bar::HAS_NATIVE_SUPPORT’ is not a valid template argument for type ‘bool’ because it is a non-constant expression
main.cpp:12:12: error: invalid type in declaration before ‘;’ token

2 个答案:

答案 0 :(得分:3)

模板参数的值必须在编译时知道,但是通过在另一个源文件中初始化成员的值,编译器无法在需要时看到该值。

您需要在类中初始化静态成员,以使其可用作编译时常量:

struct Bar
{
    static const bool HAS_NATIVE_SUPPORT = true;
};

答案 1 :(得分:1)

如果静态成员变量也在类体内初始化,那么它只是编译时常量。

因此要么在那里初始化,要么使用以下变体之一:

template <bool B>
void Y () {}

struct X {
    enum { foo = true };
    enum : bool { bar = true };
    static const bool frob = true;
    static constexpr bool frobnicate = true;
};

int main () {
    Y<X::foo>();
    Y<X::bar>();
    Y<X::frob>();
    Y<X::frobnicate>();
}