这是问题的重复:
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
template <typename T>
struct a_class {
// build an a_class instance
template <typename U>
static a_class a_builder() {
return a_class(sizeof(U));
}
// print out size
void print() {
printf("%zd\n", size_);
}
private:
a_class(ssize_t size) : size_(size) {}
ssize_t size_;
};
template <typename T>
void some_func() {
a_class<T> a = a_class<T>::a_builder<uint32_t>();
a.print();
}
int main() {
some_func();
}
在g ++ 7.3.0下,出现此错误:
╰─▸ g++ test.cc -o test
test.cc: In function ‘void some_func()’:
test.cc:26:50: error: expected primary-expression before ‘>’ token
a_class<T> a = a_class<T>::a_builder<uint32_t>();
^
test.cc:26:52: error: expected primary-expression before ‘)’ token
a_class<T> a = a_class<T>::a_builder<uint32_t>();
^
test.cc: In function ‘int main()’:
test.cc:32:15: error: no matching function for call to ‘some_func()’
some_func();
^
test.cc:25:6: note: candidate: template<class T> void some_func()
void some_func() {
^~~~~~~~~
test.cc:25:6: note: template argument deduction/substitution failed:
test.cc:32:15: note: couldn't deduce template parameter ‘T’
some_func();
^
有趣的是,如果T是具体类型:
void some_func() {
a_class<int> a = a_class<int>::a_builder<uint32_t>();
a.print();
}
一切都很好。既然是模板上下文,是否有特殊的语法?