假设我们有这样的小代码:
template<typename T>
struct Test {
Test(T t) : m_t(t) {}
T m_t;
};
int main() {
Test t = 1;
}
Run Code Online (Sandbox Code Playgroud)
这段代码很容易用[T=int]for Testclass 进行编译。现在如果我写这样的代码:
template<typename T>
struct Test {
Test(T t) : m_t(t) {}
T m_t;
};
struct S {
Test t = 1;
};
int main() {
S s;
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译并出现以下错误:
invalid use of template-name 'Test' without an argument list
Run Code Online (Sandbox Code Playgroud)
我需要像Test<int> t = 1;班员一样写它才能工作。知道为什么会发生这种情况吗?
原因
struct S {
Test t = 1;
};
Run Code Online (Sandbox Code Playgroud)
不起作用是因为你实际上没有做Test t = 1;。类内初始化程序只是一种方便的方法,可以告诉编译器t在未提供值时使用什么值进行初始化。“实际”生成的是
struct S {
S() : t(1) {} // created by the compiler
Test t;
};
Run Code Online (Sandbox Code Playgroud)
在这里您可以更容易地看到t在调用构造函数之前没有使用初始值设定项指定。