我很难弄清楚为什么下面显示的依赖项代码不能编译,并希望有助于帮助修复它。
的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
答案 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>();
}